关于链表的一些基本操作~
#pragma once #include<stdio.h> #include<assert.h> #include<stdlib.h> typedef int DataType; typedef struct SListNode { DataType data; struct SListNode *pNext; }SListNode; //初始化 void SListInit(SListNode **ppFirst) { assert(ppFirst!=NULL); *ppFirst = NULL; } //销毁 void SListDestroy(SListNode **ppFirst) { assert(ppFirst!=NULL); SListNode *pNode, *pNext; pNode = *ppFirst; while (pNode!=NULL) { pNext = pNode->pNext; free(pNode); pNode = pNext; } *ppFirst = NULL; } //申请空间 SListNode *CreateNewNode(int data) { SListNode *NewNode = (SListNode *)malloc(sizeof(SListNode)); assert(NewNode); NewNode->data = data; NewNode->pNext = NULL; return NewNode; } //尾插 void PushBack(SListNode **ppFirst, DataType data) { assert(ppFirst); //1.申请空间 SListNode *pNewNode = CreateNewNode(data); //2. if (*ppFirst == NULL) { *ppFirst = pNewNode; return; } SListNode *pNode = *ppFirst; while (pNode->pNext!=NULL) { pNode = pNode->pNext; } pNode->pNext = pNewNode; } //头插 void PushFront(SListNode **ppFirst, int data) { assert(ppFirst); SListNode *pNewNode = CreateNewNode(data); pNewNode->pNext = *ppFirst; *ppFirst = pNewNode; } //头删 void PopFront(SListNode **ppFirst) { assert(ppFirst); assert(*ppFirst); SListNode *poldFirst = *ppFirst; *ppFirst = (*ppFirst)->pNext; free(poldFirst); } //尾删 void PopBack(SListNode **ppFirst) { assert(ppFirst); assert(*ppFirst); while ((*ppFirst)->pNext == NULL) { free(*ppFirst); *ppFirst = NULL; return; } SListNode *pNode=*ppFirst; while (pNode->pNext->pNext != NULL) { pNode = pNode->pNext; } free (pNode->pNext); pNode->pNext = NULL; } //查找 SListNode *Find(SListNode *pFirst, int data) { SListNode *pNode; for (pNode = pFirst; pNode; pNode=pNode->pNext) { if (pNode->data == data) { return pNode; } } return NULL; } //按节点插入 void Insert(SListNode **ppFirst, SListNode *pPos, DataType data) { assert(ppFirst); SListNode *pNode = *ppFirst; if ( pPos==*ppFirst) { PushFront(ppFirst, data); return; } while (pNode->pNext != pPos) { pNode = pNode->pNext; } SListNode *pNewNode = CreateNewNode(data); pNode->pNext = pNewNode; pNewNode->pNext = pPos; } //按节点删除 void Erase(SListNode **ppFirst,SListNode *pPos) { assert(ppFirst); assert(*ppFirst); //SListNode *pNode = *ppFirst; if (pPos == *ppFirst) { PopFront(ppFirst); return; } SListNode *pCur; for (pCur = *ppFirst; pCur != pPos; pCur = pCur->pNext) { } pCur->pNext = pPos->pNext; free(pPos); } //删除第一次遇见的 void Remove(SListNode **ppFirst, DataType data) { SListNode *pFound = Find(*ppFirst, data); if (pFound != NULL) { Erase(ppFirst, pFound); } } //删除所有出现的 void RemoveAll(SListNode **ppFirst, DataType data) { SListNode *pNode = *ppFirst; SListNode *pNext; while (pNode->pNext) { if (pNode->pNext->data == data) { pNext = pNode->pNext; pNode->pNext = pNode->pNext->pNext; free(pNext); } else { pNode = pNode->pNext; } } if ((*ppFirst)->data == data) { PopFront(ppFirst); } } //打印 void print(SListNode *pFirst) { SListNode *pNode; for (pNode = pFirst; pNode; pNode=pNode->pNext) { printf("%d-> ", pNode->data); } printf("NULL\n"); } void SList() { SListNode *pFirst; //初始化 SListInit(&pFirst); //尾插 PushBack(&pFirst, 1); PushBack(&pFirst, 2); PushBack(&pFirst, 3); PushBack(&pFirst, 6); print(pFirst); //头插 PushFront(&pFirst, 3); PushFront(&pFirst, 14); PushFront(&pFirst, 3); print(pFirst); //头删 PopFront(&pFirst); print(pFirst); //尾删 PopBack(&pFirst); print(pFirst); //查找 SListNode *pFound = Find(pFirst, 3); if (pFound == NULL) { printf("没找到!"); } else { printf("%d\n ", pFound->data); Insert(&pFirst, pFound, 16); Erase(&pFirst, pFound); } print(pFirst); //根据数据删除 //Remove(&pFirst, 3); RemoveAll(&pFirst, 3); print(pFirst); //销毁 SListDestroy(&pFirst); }