#pragma once // 值类型 typedef int DataType; typedef struct SListNode { DataType data; // 值 struct SListNode *pNext; // 指向下一个结点 } SListNode; #include<stdio.h> #include<assert.h> #include<stdlib.h> // 初始化 void SListInit(SListNode **ppFirst) { assert(ppFirst != NULL); *ppFirst = NULL; } SListNode *NewspanceNode(int data) { SListNode *pNewNode = (SListNode*)malloc(sizeof(SListNode)); assert(pNewNode); pNewNode->data = data; pNewNode->pNext = NULL; return pNewNode; } // 尾部插入 void SListPushBack(SListNode** ppFirst, DataType data) { assert(ppFirst != NULL); SListNode *pNode = NewspanceNode(data);//能否直接开辟空间 if (*ppFirst == NULL) { *ppFirst = pNode; return; } SListNode *pNewNode; for (pNewNode = *ppFirst; pNewNode->pNext != NULL; pNewNode = pNewNode->pNext) { } pNewNode->pNext = pNode; } // 头部插入 void SListPushFront(SListNode **ppFirst, DataType data) { assert(ppFirst != NULL); SListNode *pNode = NewspanceNode(data); pNode->pNext = *ppFirst; *ppFirst = pNode; } // 尾部删除 void SListPopBack(SListNode **ppFirst) { assert(ppFirst != NULL); assert(*ppFirst != NULL); if ((*ppFirst)->pNext == NULL) { free(*ppFirst); *ppFirst = NULL; return; } SListNode *pNode; for (pNode=*ppFirst; pNode->pNext->pNext != NULL; pNode = pNode->pNext) { } free(pNode->pNext); pNode->pNext = NULL; } // 头部删除 void SListPopFront(SListNode **ppFirst) { assert(ppFirst != NULL); assert(*ppFirst != NULL); SListNode *pNode; pNode = *ppFirst; *ppFirst = (*ppFirst)->pNext; free(pNode); } // 给定结点插入,插入到结点前 void SListInsert(SListNode **ppFirst, SListNode *pPos, DataType data) { assert(ppFirst != NULL); assert(*ppFirst != NULL); SListNode *pNode = *ppFirst; if (*ppFirst == pPos) { SListPushFront(ppFirst,data); return; } SListNode *pNewNode = NewspanceNode(data); while (pNode->pNext != pPos) { pNode = pNode->pNext; } pNode->pNext = pNewNode; pNewNode->pNext = pPos; } // 给定结点删除 void SListErase(SListNode **ppFirst, SListNode *pPos) { assert(ppFirst!=NULL); assert(*ppFirst != NULL); SListNode *pNode; pNode = *ppFirst; if (pPos == *ppFirst) { SListPopFront(ppFirst); return; } while (pNode->pNext != pPos) { pNode = pNode->pNext; } pNode->pNext = pPos->pNext; free(pPos); } // 按值查找,返回第一个找到的结点指针,如果没找到,返回 NULL int SListFind(SListNode *pFirst, DataType data) { SListNode *pNode; for (pNode = pFirst; pNode; pNode = pNode->pNext) { if (pNode->data == data) { return pNode; } } return NULL; } // 按值删除,只删遇到的第一个 void SListRemove(SListNode **ppFirst, DataType data) { assert(ppFirst != NULL); assert(*ppFirst != NULL); SListNode *pNode = SListFind(*ppFirst,data); if (pNode != NULL) { SListErase(ppFirst, pNode); } } // 按值删除,删除所有的 void SListRemoveAll(SListNode **ppFirst, DataType data) { assert(ppFirst != NULL); assert(*ppFirst != NULL); SListNode *pNode = *ppFirst; SListNode *pCur; while (pNode->pNext) { if (pNode->pNext->data == data) { pCur=pNode->pNext; pNode->pNext = pNode->pNext->pNext;//能否用结点删除 free(pCur); } else{ pNode = pNode->pNext; } } if ((*ppFirst)->data == data) { SListPopFront(ppFirst); } } // 销毁 void SListDestroy(SListNode **ppFirst) { assert(ppFirst!=NULL); SListNode *pNode, *pNext; pNode = *ppFirst; while (pNode != NULL) { pNext = pNode->pNext; free(pNode); pNode = pNext; } *ppFirst = NULL; } void print(SListNode *pFirst) { SListNode *pNode; for (pNode = pFirst; pNode; pNode = pNode->pNext) { printf("%d -> ", pNode->data); } printf("NULL\n"); } void test() { SListNode *pFirst; SListInit(&pFirst); assert(pFirst == NULL); SListPushFront(&pFirst, 1); SListPushFront(&pFirst, 2); SListPushFront(&pFirst, 3); print(pFirst); SListPushBack(&pFirst, 4); SListPushFront(&pFirst, 3); print(pFirst); SListPopFront(&pFirst); print(pFirst); SListPopBack(&pFirst); print(pFirst); SListInsert(&pFirst,pFirst->pNext->pNext, 10); print(pFirst); SListInsert(&pFirst, pFirst, 12); print(pFirst); SListErase(&pFirst, pFirst); print(pFirst); SListRemove(&pFirst, 1); print(pFirst); SListPushFront(&pFirst, 3); SListPushFront(&pFirst, 3); SListPushBack(&pFirst, 3); SListPushBack(&pFirst, 3); print(pFirst); SListRemoveAll(&pFirst, 3); print(pFirst); SListDestroy(&pFirst); }
#include"slist.h" #include"Interview.h" int main() { //TestMergeOrderedList(); //test3(); //test2(); //test1(); test(); system("pause"); return 0; }