当前位置: 首页 > news >正文

【c语言数据结构】——单链表专题

一. 单链表的概念

1. 链表的概念:链表是一种在物理存储结构上非连续,非顺序的存储结构,数据在逻辑结构上是以链表中的指针链接次序实现的。

2. 单链表是由节点组成的,每个节点都有对应的地址,节点包含两部分,一是要存储的数据,二是指向下一个节点的地址的指针。

3. 为什么还需要指针变量来保存下一节点的位置?

答:链表中每一节点都是独立申请的(即需要插入数据时才会申请一块节点的空间),我们需要指针变量保存下一节点的地址,才能从当前位置找到下一节点。

二. 单链表的结构体实现

struct SListNode { int data;//节点的数据 struct SListNode* next;//指针变量用来保存下一节点的地址 }

三. 单链表各种操作的实现

1.创建单链表的结构体

//SList.htypedefintSLTDataType;typedefstructSListNode{SLTDataType data;structSListNode*next;}SLTNode;

2.创建节点

//SList.cSLTNode*SLTBuyNode(SLTDataType x){SLTNode*newNode=(SLTNode*)malloc(sizeof(SLTNode));if(newNode==NULL){perror("malloc");exit(1);}newNode->data=x;newNode->next=NULL;returnnewNode;}

3.链表的打印

//SList.cvoidSLTPrint(SLTNode*phead){SLTNode*pcur=phead;while(pcur){printf("%d->",pcur->data);pcur=pcur->next;}printf("NULL\n");}

4.尾插

//SList.cvoidSLTPushBack(SLTNode**pphead,SLTDataType x){assert(pphead)SLTNode*newnode=SLTBuyNode(x);if(*pphead==NULL){*pphead=newnode;}else{SLTNode*ptail=*pphead;while(ptail->next){ptail=ptail->next;}ptail->next=newnode;}}

5.头插

//SList.cvoidSLTPushFront(SLTNode**pphead,SLTDataType x){assert(pphead);SLTNode*newnode=SLTBuyNode(x);newnode->next=*pphead;*pphead=newnode;}

6.尾删

//SList.cvoidSLTPopBack(SLTNode**pphead){assert(pphead&&*pphead);if((*pphead)->next==NULL){free(*pphead);*pphead=NULL;}else{SLTNode*ptial=*pphead;SLTNode*prev=*pphead;while(ptial->next){prev=ptial;ptial=ptial->next;}free(ptial);ptial=NULL;prev->next=NULL;}}

7.头删

//SList.cvoidSLTPopFront(SLTNode**pphead){assert(pphead&&*pphead);SLTNode*next=(*pphead)->next;free(*pphead);*pphead=next;}

8.查找

//SList.cSLTNode*SLTFind(SLTNode*phead,SLTDataType x){SLTNode*pcur=phead;while(pcur){if(pcur->data==x)returnpcur;pcur=pcur->next;}returnNULL;}

9.在指定位置前后插入数据

9.1在指定位置之前插入数据

//SList.cvoidSLTInsert(SLTNode**pphead,SLTNode*pos,SLTDataType x){assert(pphead&&*pphead);assert(pos);SLTNode*newnode=SLTBuyNode(x);if(pos==*pphead){SLTPushFront(pphead,x);}else{SLTNode*prev=*pphead;while(prev->next!=pos){prev=prev->next;}newnode->next=pos;prev->next=newnode;}}

9.2在指定位置之后插入数据

//SList.cvoidSLTInsertAfter(SLTNode*pos,SLTDataType x){assert(pos);SLTNode*newnode=SLTBuyNode(x);newnode->next=pos->next;pos->next=newnode;}

10.删除pos节点

//SList.cvoidSLErase(SLTNode**pphead,SLTNode*pos){assert(pphead&&*pphead);assert(pos);if(pos==*pphead){SLTPopFront(pphead);}else{SLNode*prev=*pphead;while(prev->next!=pos){prev=prev->next;}prev->next=pos->next;free(pos);pos=NULL;}}

11.删除pos之后的节点

//SList.cvoidSLTEraseAfter(SLTNode*pos){assert(pos&&pos->next);SLTNode*del=pos->nest;pos->next=del->next;free(del);del=NULL;}

12.销毁链表

//SList.cvoidSLTDesTroy(SLTNode**pphead){assert(pphead&&*pphead);SLTNode*pcur=*pphead;while(pcur){SLTNode*next=pcur->next;free(pcur);pcur=next;}*pphead=NULL;}

四. 总代码

1.SList.h

//SList.h#pragmaonce#include<stdio.h>#include<stdlib.h>#include<assert.h>typedefintSLTDataType;typedefstructSListNode{SLTDataType data;structSListNode*next;}SLTNode;//创建节点SLTNode*SLTBuyNode(SLTDataType x);//打印单链表voidSLTPrint(SLTNode*phead);//尾插voidSLTPushBack(SLTNode**pphead,SLTDataType x);//头插voidSLTPushFront(SLTNode**pphead,SLTDataType x);//尾删voidSLTPopBack(SLTNode**pphead);//头删voidSLTPopFront(SLTNode**pphead);//查找SLTNode*SLTFind(SLTNode*phead,SLTDataType x);//在指定位置之前插入数据voidSLTInsert(SLTNode**pphead,SLTNode*pos,SLTDataType x);//在指定位置之后插入数据voidSLTInsertAfter(SLTNode**pphead,SLTNode*pos,SLTDataType x);//删除pos节点voidSLTErase(SLTNode**pphead,SLTNode*pos);//删除pos之后的节点voidSLTEraseAfter(SLTNode*pos);//销毁链表voidSLTDesTroy(SLTNode**pphead);

2.SList.c

//SList.c#define_CRT_SECURE_NO_WARNINGS1#include"SList.h"//创建节点SLTNode*SLTBuyNode(SLTDataType x){SLTNode*newnode=(SLTNode*)malloc(sizeof(SLTDataType));if(newnode==NULL){perror("malloc ");exit(1);}else{newnode->data=x;newnode->next=NULL;returnnewnode;}}//打印单链表voidSLTPrint(SLTNode*phead){assert(phead);while(phead){printf("%d->",phead->data);phead=phead->next;}printf("NULL\n");}// 尾插voidSLTPushBack(SLTNode**pphead,SLTDataType x){assert(pphead);SLTNode*newnode=SLTBuyNode(x);if(*pphead==NULL){*pphead=newnode;}else{SLTNode*ptail=*pphead;while(ptail->next!=NULL){ptail=ptail->next;}ptail->next=newnode;}}//头插voidSLTPushFront(SLTNode**pphead,SLTDataType x){assert(pphead);SLTNode*newnode=SLTBuyNode(x);newnode->next=*pphead;*pphead=newnode;}//尾删voidSLTPopBack(SLTNode**pphead){assert(pphead&&*pphead);SLTNode*ptail=*pphead;SLTNode*prev=*pphead;while(ptail->next!=NULL){prev=ptail;ptail=ptail->next;}free(ptail);ptail=NULL;prev->next=NULL;}//头删voidSLTPopFront(SLTNode**pphead){assert(pphead&&*pphead);SLTNode*next=(*pphead)->next;free(*pphead);*pphead=next;}//查找SLTNode*SLTFind(SLTNode*phead,SLTDataType x){assert(phead);SLTNode*newnode=SLTBuyNode(x);SLTNode*ptail=phead;while(ptail){if(newnode->data==ptail->data){returnptail;}else{ptail=ptail->next;}}returnNULL;}//在指定位置之前插入数据voidSLTInsert(SLTNode**pphead,SLTNode*pos,SLTDataType x){assert(pphead&&*pphead);assert(pos);SLTNode*newnode=SLTBuyNode(x);if(pos==*pphead){SLTPushFront(pphead,x);}else{SLTNode*prev=*pphead;while(prev->next!=pos){prev=prev->next;}newnode->next=pos;prev->next=newnode;}}//在指定位置之后插入数据voidSLTInsertAfter(SLTNode**pphead,SLTNode*pos,SLTDataType x){assert(pphead&&*pphead);assert(pos);SLTNode*newnode=SLTBuyNode(x);newnode->next=pos->next;pos->next=newnode;}//删除pos节点voidSLTErase(SLTNode**pphead,SLTNode*pos){assert(pphead&&*pphead);assert(pos);SLTNode*prev=*pphead;if(pos==*pphead){SLTPopFront(pphead);}else{while(prev->next!=pos){prev=prev->next;}prev->next=pos->next;free(pos);pos=NULL;}}//删除pos之后的节点voidSLTEraseAfter(SLTNode*pos){assert(pos&&pos->next);SLTNode*del=pos->next;pos->next=del->next;free(del);del=NULL;}//销毁链表voidSLTDesTroy(SLTNode**pphead){assert(pphead&&*pphead);SLTNode*pcur=*pphead;while(pcur->next!=NULL){SLTNode*next=pcur->next;free(pcur);pcur=next;}*pphead=NULL;}

3.test.c

//test.c#define_CRT_SECURE_NO_WARNINGS1#include"SList.h"voidSLTist01(){SLTNode*plist=NULL;//测试尾插/*SLTPushBack(&plist, 1); SLTPushBack(&plist, 2); SLTPushBack(&plist, 3); SLTPushBack(&plist, 4); SLTPrint(plist);*///测试头插/*SLTPushFront(&plist, 0); SLTPushFront(&plist, 1); SLTPushFront(&plist, 2); SLTPushFront(&plist, 3); SLTPrint(plist);*///测试尾删/*SLTPushFront(&plist, 0); SLTPushFront(&plist, 1); SLTPushFront(&plist, 2); SLTPushFront(&plist, 3); SLTPopBack(&plist); SLTPrint(plist);*///测试头删/*SLTPushFront(&plist, 0); SLTPushFront(&plist, 1); SLTPushFront(&plist, 2); SLTPushFront(&plist, 3); SLTPopFront(&plist); SLTPopFront(&plist); SLTPopBack(&plist); SLTPrint(plist);*///测试查找//SLTPushFront(&plist, 0);//SLTPushFront(&plist, 1);//SLTPushFront(&plist, 2);//SLTPushFront(&plist, 3);///*printf("%p \n",SLTFind(plist, 2));*////*SLTInsert(&plist, SLTFind(plist, 2), 8);*///SLTInsertAfter(&plist, SLTFind(plist, 2), 8);//SLTPrint(plist);//测试删除POS节点/*SLTPushFront(&plist, 0); SLTPushFront(&plist, 1); SLTPushFront(&plist, 2); SLTPushFront(&plist, 3); SLTErase(&plist, SLTFind(plist, 2)); SLTPrint(plist);*///测试删除pos之后的节点SLTPushFront(&plist,0);SLTPushFront(&plist,1);SLTPushFront(&plist,2);SLTPushFront(&plist,3);SLTEraseAfter(SLTFind(plist,2));SLTPrint(plist);}intmain(){SLTist01();return0;}

完!
若上述文章有什么错误,欢迎各位大佬及时指出,我们共同进步!

http://www.jsqmd.com/news/930052/

相关文章:

  • 暗黑2存档编辑器终极指南:3分钟学会免费修改D2/D2R游戏角色
  • 2026杭州装修设计公司推荐::杭州足浴会所/KTV装修设计公司推荐+绍兴运动馆/台球会所装修设计公司推荐合集 - 栗子测评
  • Windows 11 LTSC系统恢复微软商店的终极指南:3分钟告别应用荒
  • 旧安卓手机改造智能监控:零成本实现移动侦测与邮件报警
  • Zotero文献管理终极指南:如何用Linter插件自动格式化元数据,提升学术写作效率
  • 抖音视频怎么在线解析提取无水印,手机电脑全渠道高清无损操作详解
  • 从“激光灭蚊神器”爆单说起:出口企业,你的数据扛得住“幸福的烦恼”吗?
  • 软件研发的“工艺方差“,AI能熨平吗?
  • 从怀疑试用到真香,算下来省了八成整理时间!2026抖音学习总结我只推这一个
  • Claude Code vs Cursor:怎么选适合你的 AI 编程工具
  • 通达信缠论插件:让复杂理论变简单,三分钟看懂市场结构
  • 基于Qwen3.5-9B与YOLOv5的安全帽检测系统实践
  • 时尚广告软文批量发布怎么做?低成本高效发稿实操攻略 - 代码非世界
  • 如何在Unity游戏调试中快速定位和修改任意对象:UnityExplorer终极指南
  • AI写论文超实用!这4款AI论文写作神器,有效提升论文创作效率!
  • DIY业余无线电Go-Box:从旧行李箱到便携电台站的完整改造指南
  • 微信智能助手:告别繁琐操作,实现自动化消息管理
  • AI创作实战:从诗歌到说唱,探索提示词驱动的文本生成边界
  • AI时代人机协作指南:从认知重构到技能进化的实践路径
  • AI如何辅助选民决策:从数据采集到可视化分析的全栈实践
  • 2026教育类软文推广怎么做有效?新手零踩坑实操方法分享 - 代码非世界
  • 终极指南:如何5分钟打造完美暗黑2角色?d2s-editor存档编辑器全解析
  • DHT11与DHT22温湿度传感器:从原理到实战的嵌入式应用指南
  • 安装claudecode并接入deepseek
  • VCTK数据集下载与预处理保姆级教程:从官网压缩包到按说话人分好类的110个文件夹
  • Hitboxer:解决键盘冲突的终极方案,让游戏操作不再“打架“
  • DDrawCompat完整指南:让经典游戏在现代Windows上完美运行的终极解决方案
  • 望言OCR:10倍速硬字幕提取的终极指南,让视频字幕处理变得前所未有的简单
  • STM32F103C8T6配ESP8266自建Wi-Fi热点,手机电脑直连UDP收发验证工程
  • 【Python系列课程】Python异常处理:try/except让你的程序不再崩溃