7.在pos位置之前插入数据
// 单链表在pos位置之前插入x void SLTInsert(SLTNode** pphead, SLTNode* pos, SLTDataType x) { SLTNode* prev = *pphead; SLTNode* NewNode = BuySLTNode(x); if (prev == pos) { NewNode->next = prev; *pphead = NewNode; } else { while (prev->next != pos) { prev = prev->next; } NewNode->next = prev->next; prev->next = NewNode; } }
8.在pos位置之后插入数据
// 单链表在pos位置之后插入x void SLTInsertAfter(SLTNode* phead, SLTNode* pos, SLTDataType x) { SLTNode* prev = phead; SLTNode* NewNode = BuySLTNode(x); while (prev) { if (prev == pos) { NewNode->next = prev->next; prev->next = NewNode; break; } prev = prev->next; } }
9.删除pos位置的数据
// 单链表删除pos位置的节点 void SLTEarse(SLTNode** pphead, SLTNode* pos) { SLTNode* prev = *pphead; if (prev == pos) { *pphead = prev->next; free(prev); prev = *pphead; } else { while (prev->next != pos) { prev = prev->next; } prev->next = pos->next; free(pos); } }
10.删除pos位置之后的数据
// 单链表删除pos位置之后的节点 void SLTEarseAfter( SLTNode* pos) { SLTNode* cur = pos; assert(cur->next);//当pos指向链表最后一个节点时,不能删除pos后的值 cur = cur->next; pos->next = cur->next; free(cur); }
3.主函数(测试)
主要用于测试单链表实现的接口,大家也可以自行调整,代码如下:
void test1()//测试:头插 { SLTNode* plist = NULL; SLTPushFront(&plist, 6);//注意是传plist的地址过去(要改变plist的值就要传plist的地址,因为形参只是实参的一份临时拷贝,如果只是传plist过去就只是将phead这个plist的临时拷贝值进行改变,) SLTPushFront(&plist, 16); SLTPushFront(&plist, 62); SLTPushFront(&plist, 63); SLTPushFront(&plist, 46); SLTPushFront(&plist, 67); SLTPrint(plist); } void test2()//测试:尾插 { SLTNode* plist = NULL; SLTPushBack(&plist, 16); SLTPushBack(&plist, 62); SLTPushBack(&plist, 63); SLTPushBack(&plist, 46); SLTPushBack(&plist, 67); SLTPrint(plist); } void test3()//测试:头删 { SLTNode* plist = NULL; SLTPushBack(&plist, 16); SLTPushBack(&plist, 62); SLTPushBack(&plist, 63); SLTPushBack(&plist, 46); SLTPushBack(&plist, 67); SLTPopFront(&plist); SLTPopFront(&plist); SLTPrint(plist); SLTPopFront(&plist); SLTPopFront(&plist); SLTPopFront(&plist); SLTPrint(plist); } void test4()//测试:尾删 { SLTNode* plist = NULL; SLTPushBack(&plist, 16); SLTPushBack(&plist, 18); SLTPushBack(&plist, 16); SLTPushBack(&plist, 56); SLTPushBack(&plist, 78); SLTPopBack(&plist); SLTPrint(plist); SLTPopBack(&plist); SLTPopBack(&plist); SLTPopBack(&plist); SLTPrint(plist); } void test5()//测试:查找 { SLTNode* plist = NULL; SLTPushBack(&plist, 26); SLTPushBack(&plist, 18); SLTPushBack(&plist, 16); SLTPushBack(&plist, 56); SLTPushBack(&plist, 78); SLTNode* ret = SLTFind(plist, 56); if (ret) { printf("%p\n",ret); } } void test6()//测试:在pos位置之前插入数据 { SLTNode* plist = NULL; SLTPushBack(&plist, 26); SLTPushBack(&plist, 18); SLTPushBack(&plist, 16); SLTPushBack(&plist, 56); SLTPushBack(&plist, 78); SLTPrint(plist); //SLTNode* pos = SLTFind(plist, 26); //SLTInsert(&plist, pos, 55);//相当于头插 //SLTNode* pos = SLTFind(plist, 16); //SLTInsert(&plist, pos, 55);//正常插入 //SLTNode* pos = SLTFind(plist, 88);//pos不是链表中的数据,会被SLTFind检测出来不会进行插入 //SLTInsert(&plist, pos, 98);//正常插入 SLTInsert(&plist,NULL, 55);//相当于尾插 SLTPrint(plist); } void test7()//测试:插入(在pos位置之后插入)//不可能进行头插 { SLTNode* plist = NULL; SLTPushBack(&plist, 26); SLTPushBack(&plist, 18); SLTPushBack(&plist, 16); SLTPushBack(&plist, 56); SLTPushBack(&plist, 78); SLTPrint(plist); SLTNode* pos = SLTFind(plist, 78);//相当于尾插 SLTInsertAfter(plist, pos, 55); SLTInsertAfter(plist, plist, 55); SLTPrint(plist); } void test8()//测试:删除pos位置的数据 { SLTNode* plist = NULL; SLTPushBack(&plist, 26); SLTPushBack(&plist, 18); SLTPushBack(&plist, 16); SLTPushBack(&plist, 56); SLTPushBack(&plist, 78); SLTPrint(plist); SLTNode* pos = SLTFind(plist, 78);//相当于尾删 SLTEarse(&plist, pos); SLTPrint(plist); } void test9()//测试:删除pos位置之后的数据 { SLTNode* plist = NULL; SLTPushBack(&plist, 26); SLTPushBack(&plist, 18); SLTPushBack(&plist, 16); SLTPushBack(&plist, 56); SLTPushBack(&plist, 78); SLTPrint(plist); SLTNode* pos = SLTFind(plist, 56); SLTEarseAfter(pos); SLTPrint(plist); } int main() { //test1(); //test2(); //test3(); //test4(); //test5(); //test6(); //test7(); //test8(); test9(); return 0; }
总结
以上就是今天要讲的内容,本文介绍了线性表中的链表,主要实现了单链表(无头不循环单链表),大家感兴趣的也可以根据作者所写思路(注释)自行实现单链表。
本文作者也是一个正在学习编程的萌新,目前也只是刚开始接触数据结构这方面的内容,如果有什么内容方面的错误或者不严谨,欢迎大家在评论区指出。
最后,如果本篇文章对你有所启发的话,也希望可以支持支持作者,谢谢大家!