本文只要实现单链表的初始化、插入(尾插、头插、任意位置插入)、删除(尾删、头删、删除指定元素)、查找等。
定义单链表
typedef int DataType; typedef struct LinkNode { DataType data; struct LinkNode *next; }LinkNode, *pLinkNode, *pList;
实现单链表的所有接口:
void InitLinkList(pList* pHead);//单链表的初始化 void Destroy(pList *pHead);//销毁(动态开辟的内存释放) void PushBack(pList* pHead, DataType x);//尾插 void PopBack(pList* pHead);//尾删 void PushFront(pList* pHead, DataType x);//头插 void PopFront(pList* pHead);//头删 void PrintList(pList list);//打印单链表的元素 int GetListLength(pList head);//获取单链表的长度 pLinkNode Find(pList head, DataType x);//查找元素 void Insert(pList *pHead, pLinkNode pos, DataType x);//任意位置插入元素 void Remove(pList *pHead, DataType x);//删除指定元素 void RemoveAll(pList *pHead, DataType x);//删除单链表中所有指定元素 void Erase(pList *pHead, pLinkNode pos);//按位置删除
实现接口的函数:
void InitLinkList(pList* pHead)//单链表的初始化 { assert(pHead); *pHead = NULL; } void Destroy(pList *pHead)//销毁(动态开辟的内存释放) { assert(pHead); pLinkNode del = NULL; pLinkNode cur = *pHead; while (*pHead) { del = *pHead; *pHead = (*pHead)->next; free(del); del = NULL; } } pLinkNode BuyNode(DataType x)//创建新节点 { pLinkNode NewNode = (pLinkNode)malloc(sizeof(LinkNode)); NewNode->data = x; NewNode->next = NULL; return NewNode; } void PushBack(pList* pHead, DataType x) { assert(pHead); pLinkNode cur = *pHead; pLinkNode NewNode=BuyNode(x); if (cur == NULL) { *pHead = NewNode; } else { while (cur->next) { cur = cur->next; } cur->next = NewNode; } } void PrintList(pList list) { pLinkNode cur = list; printf("list is: "); while (cur) { printf("%d->", cur->data); cur = cur->next; } printf("over\n"); } void PopBack(pList* pHead) { assert(pHead); pLinkNode cur = *pHead; pLinkNode del = NULL; if (cur == NULL) { return; } else if (cur->next == NULL) { free(cur); *pHead = NULL; } else { while (cur->next->next) { cur = cur->next; } del = cur->next; cur->next = NULL; free(del); del = NULL; } } void PushFront(pList* pHead, DataType x) { assert(pHead); pLinkNode NewNode = BuyNode(x); pLinkNode cur = *pHead; if (cur == NULL) { *pHead = NewNode; } else { NewNode->next = *pHead; *pHead = NewNode; } } void PopFront(pList* pHead) { assert(pHead); pLinkNode cur = *pHead; pLinkNode del = cur; if (cur == NULL) { return; } else { *pHead = cur->next; free(del); del = NULL; } } int GetListLength(pList head) { int count = 0; pLinkNode cur = head; while (cur) { count++; cur = cur->next; } return count; } pLinkNode Find(pList head, DataType x) { pLinkNode cur = head; while (cur) { if (cur->data == x) return cur; else cur = cur->next; } return NULL; } void Insert(pList *pHead, pLinkNode pos, DataType x) { assert(pHead); assert(pos); pLinkNode cur = *pHead; pLinkNode NewNode = BuyNode(x); if (cur ==pos) { NewNode->next = cur; *pHead = NewNode; } else { while (cur->next!=pos) { cur = cur->next; } NewNode->next =cur->next; cur->next = NewNode; } } void Remove(pList *pHead, DataType x) { assert(pHead); pLinkNode cur = *pHead; pLinkNode prev = NULL; pLinkNode del = NULL; while (cur) { if (cur->data == x) { del = cur; if (cur == *pHead) { *pHead = cur->next; } else { prev->next = cur->next; } free(del); del = NULL; break; } prev = cur; cur = cur->next; } } void Erase(pList *pHead, pLinkNode pos) { assert(pHead); assert(pos); pLinkNode cur = *pHead; pLinkNode del = cur; pLinkNode prev = NULL; while (cur) { del = cur; if (cur == pos) { if (cur == *pHead) { *pHead = cur->next; } else { prev->next = cur->next; } free(del); del = NULL; break; } prev = cur; cur = cur->next; } } void RemoveAll(pList *pHead, DataType x) { assert(pHead); pLinkNode cur = *pHead; pLinkNode prev = NULL; pLinkNode del = NULL; while (cur) { if (cur->data == x) { del = cur; if (cur == *pHead) { *pHead = cur->next; cur = *pHead; } else { prev->next = cur->next; cur = prev->next; } free(del); del = NULL; } else { prev = cur; cur = cur->next; } } }
原文地址:http://haipi.blog.51cto.com/10778780/1737084