现在的位置: 首页 > 综合 > 正文

单链表实现及基本操作

2013年10月19日 ⁄ 综合 ⁄ 共 1894字 ⁄ 字号 评论关闭

单链表实现及基本操作

#include <malloc.h>
#include <stdio.h>

typedef enum {
	RET_ERROR, RET_OK
} RET_TYPE;

typedef struct listNode
{
	int data;
	struct listNode *pNext;
} mylist;

mylist* createList()
{
	mylist *pHead = NULL;

	pHead = (mylist*) malloc(sizeof(mylist));
	if (NULL == pHead)
	{
		return NULL;
	}

	//可以加入对头结点data的特殊处理
	pHead->pNext = NULL;

	return pHead;
}

mylist* pushBackData(mylist *pHead, int data)
{
	mylist *p = NULL;
	mylist *q = pHead;
	if (NULL == pHead)
	{
		return NULL;
	}

	p = (mylist*) malloc(sizeof(mylist));
	if (NULL == p)
	{
		return NULL;
	}

	p->data = data;
	p->pNext = NULL;
		
	while (NULL != q->pNext)
	{
		q = q->pNext;
	}

	q->pNext = p;

	return pHead;
}

mylist* deleteData(mylist* pHead, int data)
{
	mylist *pPre = NULL;
	mylist *pCur = NULL;
	
	if (NULL == pHead)
	{
		return NULL;
	}

	pPre = pHead;
	pCur = pHead->pNext;
	while (NULL != pCur)
	{
		if (pCur->data == data)
		{
			break;
		}

		pPre = pCur;
		pCur = pCur->pNext;
	}

	if (NULL != pCur)
	{
		pPre->pNext = pCur->pNext;
		free(pCur);
		pCur = NULL;
	}
	
	return pHead;
}

RET_TYPE removeList(mylist *pHead)
{
	mylist* p = NULL;

	if (NULL == pHead)
	{
		return RET_ERROR;
	}
	
	//移除链表要将头结点一并删除
	p = pHead->pNext;
	while (NULL != p)
	{
		free(pHead);
		pHead = p;
		p = p->pNext;
	}
	free(pHead);
	pHead = NULL;

	return RET_OK;
}

mylist* findByData(const mylist* pHead, int data)
{
	mylist *p = NULL;

	if (NULL == pHead)
	{
		return NULL;
	}
	
	p = pHead ->pNext;
	while (NULL != p)
	{
		if (p->data == data)
		{
			break;
		}
		p = p->pNext;
	}

	return p;
}

void printList(const mylist *pHead)
{
	mylist *p = NULL;
	if (NULL == pHead)
	{
		return ;
	}
	
	p = pHead->pNext;
	while (NULL != p)
	{
		printf("%d  ",p->data);
		p = p->pNext;
	}
	printf("\n");
}

int main()
{
	mylist *pHead = createList();
	mylist *p = NULL;
	if (NULL == pHead)
	{
		printf("create failed...\n");
	}
	else
	{
		pHead = pushBackData(pHead,1);
		pHead = pushBackData(pHead,2);
		pHead = pushBackData(pHead,3);
		pHead = pushBackData(pHead,4);
		pHead = pushBackData(pHead,5);
		printList(pHead);

		p = findByData(pHead,4);
		if (NULL != p)
		{
			printf("%d\n",p->data);
		}
		else
		{
			printf("Not exists\n");
		}

		pHead = deleteData(pHead,4);
		pHead = deleteData(pHead,1);
		p = findByData(pHead,4);
		if (NULL != p)
		{
			printf("%d\n",p->data);
		}
		else
		{
			printf("Not exists\n");
		}

		printList(pHead);
		
		if (RET_OK == removeList(pHead))
		{
			printf("List removed success.\n");
		}
	}

	return 0;
}

 

抱歉!评论已关闭.