#include <stdio.h> #include <assert.h> #include <malloc.h> typedef int DataType; typedef struct SListNode { DataType data; struct SListNode *pNext; }SListNode; SListNode *NewSpace() { SListNode *pNew = (SListNode *)malloc(sizeof(SListNode)); assert(pNew); pNew->pNext = NULL; pNew->data = 0; return pNew; } //初始化 void SListInit(SListNode **ppFirst) { assert(ppFirst); (*ppFirst) = NULL; return; } //头插 void PushFront(SListNode **ppFirst, DataType data) { assert(*ppFirst); SListNode *pTmpNode = NewSpace(); pTmpNode->data = data; pTmpNode->pNext = (*ppFirst); (*ppFirst) = pTmpNode; } //尾插 void PushBack(SListNode **ppFirst, DataType data) { assert(ppFirst); if ((*ppFirst) == NULL){ (*ppFirst) = NewSpace(); (*ppFirst)->pNext = NULL; (*ppFirst)->data = data; return; } SListNode *pTmpNode = (*ppFirst); while (pTmpNode->pNext != NULL){ pTmpNode = pTmpNode->pNext; } pTmpNode->pNext = NewSpace(); pTmpNode->pNext->pNext = NULL; pTmpNode->pNext->data = data; } //头删 void PopFront(SListNode **ppFirst) { if ((*ppFirst) == NULL){ printf("ERROR\n"); return; } SListNode *pTmpNode = (*ppFirst); (*ppFirst) = (*ppFirst)->pNext; free(pTmpNode); pTmpNode = NULL; } //尾删 void PopBack(SListNode **ppFirst) { if ((*ppFirst) == NULL){ printf("ERROR\n"); return; } SListNode *pTmpNode = (*ppFirst); while (pTmpNode->pNext->pNext != NULL){ pTmpNode = pTmpNode->pNext; } free(pTmpNode->pNext); pTmpNode->pNext = NULL; } //按数据删 void DeData(SListNode **ppFirst, DataType data) { assert(*ppFirst); SListNode *pTmpNode = (*ppFirst); if (pTmpNode->data == data){ //判断是否为第一个结点的数据 (*ppFirst) = (*ppFirst)->pNext; free(pTmpNode); pTmpNode = NULL; return; } while (pTmpNode->pNext != NULL){ if (pTmpNode->pNext->data == data){ SListNode *pNode = pTmpNode->pNext; pTmpNode->pNext = pNode->pNext; free(pNode); pNode = NULL; return; } pTmpNode = pTmpNode->pNext; } if (pTmpNode->data == data){ //上条语句退出后还剩最后一个结点没有判断 free(pTmpNode); pTmpNode = NULL; return; } printf("Not Found!\n"); } //按数据删除所有遇到的 void DeDataAll(SListNode **ppFirst, DataType data) { assert(*ppFirst); SListNode *pTmpNode = (*ppFirst); if ((*ppFirst)->data == data){ pTmpNode = (*ppFirst); (*ppFirst) = (*ppFirst)->pNext; free(pTmpNode); pTmpNode = NULL; } while (pTmpNode->pNext != NULL){ if (pTmpNode->pNext->data == data){ SListNode *pNode = pTmpNode->pNext; pTmpNode->pNext = pNode->pNext; free(pNode); pNode = NULL; continue; } pTmpNode = pTmpNode->pNext; } if (pTmpNode->data == data){ free(pTmpNode); pTmpNode = NULL; } } //按地址删 void DePos(SListNode **ppFirst, SListNode *pPos) { assert(ppFirst); assert(*ppFirst); SListNode *pTmpNode = (*ppFirst); if (pPos == (*ppFirst)){ (*ppFirst) = (*ppFirst)->pNext; free(pTmpNode); pTmpNode = NULL; return; } } //前插 void InsertFront(SListNode **ppFirst, SListNode *pPos, DataType data) { assert(*ppFirst); assert(ppFirst); SListNode *pTmpNode = (*ppFirst); if ((*ppFirst) == pPos){ pTmpNode = NewSpace(); pTmpNode->data = data; pTmpNode->pNext = (*ppFirst); (*ppFirst) = pTmpNode; return; } while (pTmpNode->pNext != pPos){ pTmpNode = pTmpNode->pNext; } SListNode *pNode = NewSpace(); pNode->data = data; pNode->pNext = pTmpNode->pNext; pTmpNode->pNext = pNode; } // 按值查找,返回第一个找到的结点指针,如果没找到,返回 NULL void FindPos(SListNode **ppFirst, DataType data) { assert(*ppFirst); SListNode *pTmpNode = (*ppFirst); while (pTmpNode != NULL){ if (pTmpNode->data == data){ printf("按值查找,返回地址 %p\n\n", pTmpNode); return; } pTmpNode = pTmpNode->pNext; } printf("Not Found!\n"); } //销毁 void Destory(SListNode **ppFirst) { assert(*ppFirst); SListNode *pTmpNode = (*ppFirst); while ((*ppFirst) != NULL){ (*ppFirst) = (*ppFirst)->pNext; free(pTmpNode); pTmpNode = (*ppFirst); } pTmpNode = NULL; } //打印 void Display(SListNode *ppFirst) { assert(ppFirst); SListNode *pTmpNode = ppFirst; while (pTmpNode->pNext != NULL){ printf("%d ", pTmpNode->data); pTmpNode = pTmpNode->pNext; } printf("%d \n\n", pTmpNode->data); } int main(void) { SListNode *SL; SListInit(&SL); PushBack(&SL, 11); PushBack(&SL, 3); PushBack(&SL, 3); PushBack(&SL, 66); PushBack(&SL, 77); printf("尾插 "); Display(SL); PushFront(&SL, 4); PushFront(&SL, 3); PushFront(&SL, 2); PushFront(&SL, 1); printf("头插 "); Display(SL); PopFront(&SL); printf("头删 "); Display(SL); PopBack(&SL); printf("尾删 "); Display(SL); DeData(&SL, 4); printf("按数据删 "); Display(SL); DeDataAll(&SL, 3); printf("按数据删除所有遇到的 "); Display(SL); DePos(&SL, (SL->pNext)); printf("按地址删 "); Display(SL); InsertFront(&SL, SL->pNext, 99); printf("按地址插入 "); Display(SL); FindPos(&SL, 2); printf("销毁 \n\n"); // Destory(&SL); // Display(SL); system("pause"); return 0; }
代码实现链表的操作函数
猜你喜欢
转载自blog.csdn.net/ironman240/article/details/80726651
今日推荐
周排行