自写一个单链表

发布时间:2026/5/29 3:10:56

自写一个单链表 参考图文件 SList.h#define _CRT_SECURE_NO_WARNINGS 1#includestdio.h#includestdlib.h#includeassert.h//自定节点的结构//数据加指向下一个节点的指针typedef int SLTDataType;typedef struct SListNode{SLTDataType data;struct SListNode* next;}SLTNode;void SLTPrint(SLTNode* phead);//尾插void SLTPushBack(SLTNode** pphead, SLTDataType x);//头插void SLTPushFront(SLTNode** pphead, SLTDataType x);//尾删void SLTPopBack(SLTNode** pphead);//头删void SLTPopFront(SLTNode** pphead);//查找SLTNode* SLTFind(SLTNode* phead, SLTDataType x);//再指定位置之前插入数据void SLTInsert(SLTNode** phead, SLTNode* pos, SLTDataType x);//在指定位置之后插入数据void SLTInsertAfter(SLTNode* pos, SLTDataType x);//删除pos节点void SLTErase(SLTNode** pphead, SLTNode* pos);//删除pos之后的节点void SLTEraseAfter(SLTNode* pos);//链表的销毁void SListDestory(SLTNode** pphead);文件 SList.c#define _CRT_SECURE_NO_WARNINGS 1#includeSList.hvoid SLTPrint(SLTNode* phead){SLTNode* pcur phead;while (pcur)//purNULL{printf(%d-, pcur-data);pcur pcur-next;}printf(NULL\n);}//申请新的节点给新节点分配一块和SLTNode大小相同的内存SLTNode* SLTBuyNode(SLTDataType x){SLTNode* newnode (SLTNode*)malloc(sizeof(SLTNode));if (newnode NULL) //防止野指针{perror(malloc);exit(1);}// 初始化新节点数据存xnext指向NULL暂时没有后续节点newnode-data x;newnode-next NULL;// 返回新节点的地址return newnode;}//尾插void SLTPushBack(SLTNode** pphead, SLTDataType x){assert(pphead);//*pphead就是指向第一个节点的指针SLTNode* newnode SLTBuyNode(x); //这里拿到新节点的地址存在newnode变量里//找尾if (*pphead NULL){*pphead newnode;}else{SLTNode* ptail *pphead;//从最开始的节点找while (ptail-next)//ptail-next!NULL{ptail ptail-next; //直到ptail-next是NULL此时ptail就是尾节点}//把尾节点的next指向新节点ptail-next newnode;}}//头插void SLTPushFront(SLTNode** pphead, SLTDataType x){assert(pphead);SLTNode* newnode SLTBuyNode(x);newnode-next *pphead;//newnode指针连接在*pphead第一个节点*pphead newnode;// newnode为新头 完成头插}//尾删void SLTPopBack(SLTNode** pphead){assert(pphead *pphead);//确保二级和头指针不为空if ((*pphead)-next NULL) //只有一个节点 - 比*的优先级高{free(*pphead);*pphead NULL;}else{SLTNode* ptail *pphead;//指向尾巴SLTNode* prev *pphead;//指向尾巴前一个while (ptail-next)//ptail-next!NULL{prev ptail;ptail ptail-next;}free(ptail);ptail NULL;prev-next NULL;}}// 头删void SLTPopFront(SLTNode** pphead){assert(pphead *pphead);SLTNode* next (*pphead)-next;//-比* 的优先级高free(*pphead);*pphead next;}//查找SLTNode* SLTFind(SLTNode* phead, SLTDataType x){SLTNode* pcur phead;//使头地址保持不变while(pcur)//pur!NULL{if (pcur-data x){return pcur;}pcur pcur-next;}return NULL;//未找到}void SLTInsert(SLTNode** pphead, SLTNode* pos, SLTDataType x){assert(*pphead pphead);SLTNode* newnode SLTBuyNode(x);SLTNode* prev *pphead;if (pos *pphead){//头插SLTPushFront(pphead, x);}else{while (prev-next ! pos){prev prev-next;}prev-next newnode;newnode-next pos;}}//在指定位置之后插入数据void SLTInsertAfter(SLTNode* pos, SLTDataType x){assert(pos);SLTNode* newnode SLTBuyNode(x);newnode-nextpos-next ;pos-next newnode;}//删除pos节点void SLTErase(SLTNode** pphead, SLTNode* pos){assert(pphead *pphead);assert(pos);if (pos *pphead){//头删SLTPopFront(pphead);/*SLTNode* next (*pphead)-next;free(*pphead);*pphead next;*/}SLTNode* prev *pphead;while (prev-next ! pos){prev prev-next;}prev-next pos-next;free(pos);pos NULL;}//删除pos之后的节点void SLTEraseAfter(SLTNode* pos){assert(pos pos-next);SLTNode* del pos-next;pos-next del-next;free(del);del NULL;}//链表的销毁void SListDestory(SLTNode** pphead){assert(pphead *pphead);SLTNode* pcur *pphead;while (pcur){SLTNode* next pcur-next;free(pcur);pcur next;}*pphead NULL;}文件test.c#define _CRT_SECURE_NO_WARNINGS 1#includeSList.h//void SListTest01()//{// //链表是由一个一个节点组成// //创建几个节点// SLTNode* node1 (SLTNode*)malloc(sizeof(SLTNode));// node1-data 1;//// SLTNode* node2 (SLTNode*)malloc(sizeof(SLTNode));// node2-data 2;//// SLTNode* node3 (SLTNode*)malloc(sizeof(SLTNode));// node3-data 3;//// SLTNode* node4 (SLTNode*)malloc(sizeof(SLTNode));// node4-data 4;//// //连接节点// node1-next node2;// node2-next node3;// node3-next node4;// node4-next NULL;// SLTNode* plist node1;// SLTPrint(plist);}SListTest02(){SLTNode* plist NULL;SLTPushBack(plist, 1);SLTPushBack(plist, 2);SLTPushBack(plist, 3);SLTPushBack(plist, 4);SLTPrint(plist);//头插//SLTPushFront(plist, 5);//SLTPushFront(plist, 6);//SLTPushFront(plist, 7);//SLTPrint(plist);// 尾删//SLTPopBack(plist);//SLTPrint(plist);//SLTPopBack(plist);//SLTPrint(plist);//头删//SLTPopFront(plist);//SLTPopFront(plist);//SLTPopFront(plist);//SLTPrint(plist);SLTNode*FindSLTFind(plist, 3);//if (Find NULL)//{// printf(没有找到\n);//}//else//{// printf(找到了\n);//}//SLTEraseAfter(Find);SListDestory(plist);/*SLTErase(plist, Find);*//*SLTInsert(plist, Find, 99);SLTPrint(plist);*//*SLTInsertAfter(Find, 99);*/SLTPrint(plist);}int main(){/*SListTest01();*/SListTest02();return 0;}

相关新闻