参考书:王道考研数据结构

(此贴为博主学习408的笔记,因博主也是学习者,个人总结如有错误欢迎指正。如有侵权请告知,马上删除致歉)​​

单链表定义

单链表是线性表的链式存储,通过一组任意的存储单元来存储线性表的数据元素。每个结点包含数据域和指针域。单链表只有一个指向后继结点的next后继指针。

单链表可以解决顺序表需要大量连续的存储单元的缺点,其离散的分布在存储空间内,逻辑上连续,物理上不连续。因为是非随机存取的特性,所以在查找某一个结点的时候,需要从头遍历,依次查找。

#include <stdio.h>
#include <stdlib.h>/**********************************************
制作人:祝星。
项目名称:数据结构-单链表的基本操作(C语言实现)
完成时间:2021年11月4日
完成内容:单链表的创建,修改,增加,删除,销毁。
更新时间:2022年7月20日
更新内容:头插法优化,销毁功能优化(基于新王道知识点)
具体内容,头插法,尾插法,按位查找,按位删除,指定结点后插,指定位序后插,指定位序前插,指定结点前插,求表长,遍历输出,销毁单链表
运行环境:win10
程序环境:VC++
文件语言:C语言
文件类型:.cpp
注:1.VC++的.cpp环境,&为取地址。2.LNode *等价于LinkList,前者强调这是结点,后者强调这是链表,合适的地方使用合适的名字,代码可读性更高。
***********************************************//*定义有头结点单链表的结点结构*/
typedef struct node{int data;  //每个结点存放的数据类型struct node *next;//结点存放的指针域指向下一个结点
}LNode, *LinkList;//前者强调这是结点,后者强调这是链表/************************
函数名:尾插法创建单链表
参数:L
返回值:创建好的表
*************************/
LinkList T_InitList(LinkList &L){int x;   //初始化输入的值L = (LinkList)malloc(sizeof(LNode));//动态申请头结点LNode *s,*r = L;//初始化两个结点指针指向头结点L->next=NULL;//头指针指向NULL,防止脏数据printf("输入(9999结束)");scanf("%d",&x);//输入插入的值,输入9999结束while(x!=9999){s = (LNode*)malloc(sizeof(LNode));//动态申请一个存放插入值的结点s->data=x;//将输入的值赋值给新申请结点r->next=s;//将指向头结点的r的next指针指向sr=s;//将r的指针指向sprintf("输入(9999结束)");scanf("%d",&x);}r->next=NULL;//r的next指针指向NULLreturn L;//返回创建好的表
}   /************************
函数名:头插法创建单链表
参数:L
返回值:创建好的表
*************************/
LinkList H_InitList(LinkList &L){int x;//初始化输入的值L = (LinkList)malloc(sizeof(LNode));//动态申请头结点LNode *s;//初始化一个指针指向头结点L->next=NULL;//头指针指向NULL,防止脏数据printf("输入(9999结束)");scanf("%d",&x);//输入插入的值,输入9999结束while(x!=9999){s = (LNode*)malloc(sizeof(LNode));//动态申请一个存放插入值的结点s->data=x;//将输入的值赋值给新申请结点s->next=L->next;//s的next指针指向头指针指向的NULLL->next=s;//头结点的NEXT指针指向sprintf("输入(9999结束)");scanf("%d",&x);}return L;//返回创建好的表
}   /*******************************
函数名:按位查找
参数:L,i
返回值:返回结点指针值
*******************************/
LNode *GetElem(LinkList L,int i){int j=1;//因为有头结点,所以从1开始遍历if(i<0){//判断查找的位置是否合法printf("数值非法");}LNode *p = L->next;//初始化结点指针while(p!=NULL&&j<i){p=p->next;j++;}return p;
}/*******************************
函数名:按位删除结点
参数:L,i
返回值:返回结点指针值
*******************************/
LinkList DeleteNode(LinkList &L,int i){LNode *p;p=GetElem(L,i-1);//调用按位查找函数if(p==NULL){     //找到待删除第i个元素的前驱结点return false;    //如果此前去结点为空或者前驱结点的下一个结点为空}              //就是说该i位置为NULL,不能被删除,没有值能被删除if(p->next==NULL){return false;}LNode *q=p->next;//初始化q指向前驱结点p的下一个,就是第i位置元素p->next=q->next;//p指向q的下一个结点free(q);//删除qreturn L;
}
/*指定结点的后插*/
LinkList InsertNextNode(LinkList &L,LNode *p,int e){if(p==NULL)return false;LNode *s = (LNode*)malloc(sizeof(LNode));//申请不到内存空间则返回falseif(s==NULL)return false;s->data=e;s->next=p->next;p->next=s;return L;
}
/*指位序后插入*/
LinkList InsertNNode(LinkList &L,int i,int e)
{if(i<1)return false;LNode *s;int j=0;s=L;while(s!=NULL&&j<i){s=s->next;j++;}if(s==NULL)return false;return InsertNextNode(L,s,e);
}/*指定结点的前插*/
LinkList InsertPriorNode(LinkList &L,LNode *p,int e){if(p==NULL)return false;LNode *s = (LNode*)malloc(sizeof(LNode));if(s==NULL)return false;s->data=e;s->next=p->next;p->next=s;return L;
}
/*指位序前插入*/
LinkList InsertPNode(LinkList &L,int i,int e)
{LNode *p = GetElem(L,i-1);    return InsertPriorNode(L,p,e);
}/*按值查找*/
int  LocateElem(LinkList L,int e)
{int i=1;LNode *p = L->next;while(p!=NULL&&p->data!=e){p=p->next;i++;}return i;
}/*求表长*/
int Length(LinkList L)
{int len=0;LNode *p=L;while (p->next!=NULL){p=p->next;len++;}return len;
}/*遍历输出*/
void Show(LinkList L){printf("当前单链表的所有元素:【head】->");LNode *p;p =L->next;while(p!=NULL){printf("[%d]->",p->data);p=p->next;}printf("NULL");printf("\n");printf("当前表长为%d\n",Length(L));printf("-----------------------------------------------------------\n");
}void DestroyList(LinkList &L)
{LNode *p ,*q;p= L->next;q=p;while(p!=NULL){q=p->next;free(p);p = q;}L->next = NULL;printf("\n销毁成功\n");
}/*主函数*/
int main(){LinkList l;l = T_InitList(l);Show(l);DeleteNode(l,3);printf("删除第三个位置的元素后:");Show(l);printf("在第二个位置后插入99:");InsertNNode(l,2,99);Show(l);printf("在第4个位置前插入101:");InsertPNode(l,4,101);Show(l);printf("101元素的位置是%d    \n",LocateElem(l,101));DestroyList(l);Show(l);return 0;
}

数据结构-单链表基本操作(C语言实现)相关推荐

  1. 数据结构-单链表基本操作-C语言代码

    单链表基本操作 1.头插法建立单链表 2.尾插法建立单链表 3.查找结点 3.修改结点 4.插入结点 5.删除结点 本篇只有c语言代码,具体思路讲解请看这篇博客:数据结构-线性结构-单链表 1.头插法 ...

  2. c语言单链表功能,[数据结构]单链表(C语言)的各种功能

    06-03阅读200,000 + 链表是一种常见的基本数据结构,在此充分利用了结构指针. 链表可以动态存储和分配,即链表是一个功能非常强大的数组. 他可以在节点中定义多种数据类型,并可以根据需要随意添 ...

  3. 数据结构-单链表基本操作带图完整详解

    1.什么是链表 链表是一种物理存储结构上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指 针链接次序实现的. 2.为什么要使用链表 在未学习链表时,我们常用的存储数据的方式无非就是数组.使 ...

  4. 数据结构——单链表基本操作的实现

    单链表的基本操作的实现 单链表的初始化 判断链表是否为空 单链表的销毁 清空链表 求链表表长 取单链表中第i个元素的内容 根据指定值获取该值所在的位置(地址) 根据指定值获取该值所在的位置序号 插入元 ...

  5. 数据结构-单链表基本操作

    单链表 文章目录 单链表 通常使用两个类:链表的结点类和链表类,协同表示单链表 1.链表结点类的定义 2.单链表类的定义 3.单链表输入(前插法) 4.单链表的输出 5.删去链表中除表头结点外的所有其 ...

  6. C 语言单链表基本操作

    复习下数据结构,使用 C 语言实现了带头节点的单链表.单链表基本操作有:节点初始化.链表初始化.插入节点.查找节点.删除节点和删除链表等.下面的程序中,list.h 为头文件, 其中包含了上述基本操作 ...

  7. C语言单链表基本操作总结

    C语言单链表基本操作     本文是参考他人实现的C语言单链表,对多篇博文整理的结果,仅作为学习笔记.文末有参考出处. 1.单链表定义 链表是通过一组任意的存储单元来存储线性表中的数据元素,这些存储单 ...

  8. 数据结构上机-尾、头插法建立单链表-单链表遍历C语言完整代码实现

    点击此处跳转视频链接:数据结构上机-尾.头插法建立单链表-单链表遍历C语言完整代码实现

  9. C语言数据结构 单链表的建立、遍历、查找、插入和删除操作

    参考文献 本博文为半摘记性质 -- 声明:全文主干部分摘自 [1] 杨智明. 数据结构(C语言版)[M]. 第一版. 北京:北京理工大学出版社, 2016. [2] 严蔚敏, 李冬梅, 吴伟民. 数据 ...

最新文章

  1. Git命令按人统计提交次数和代码量
  2. python 对excel文件进行分词并进行词频统计_python 词频分析
  3. 系统运维篇之HP-DL580-Linux配置Bonding网卡组实例
  4. 用Java测试多线程代码
  5. 查询分析器下如何备份数据库
  6. Android 系统(163)---Gallery为何有的图片在详细信息里查看其分辨率与实际不一样?
  7. Express简单路由使用
  8. 工具的使用——vs2013(三)
  9. 双线性插值函数的形状
  10. iOS中__block 关键字的底层实现原理
  11. hbase java 分页查询_HBase伪快速分页查询
  12. python 玩彩票程序 随机产生两位数与用户输入的相比较
  13. EmmyLua For Intellij IDEA注解功能的一些用法
  14. 逻辑分析题目:“给你一个9升的水桶和一个4升的水桶,在河里取6升水”
  15. 压缩的Swf文件利用Python解压
  16. 如何使用python做中文情感分析
  17. 乘大潮而崛起,浪潮云洲大有可为
  18. 3D游戏建模怎么接外包
  19. 大S首度曝光女儿正面照:小小幸福分享给大家
  20. ccsa安学网小程序_CCSA安学网安全题库完整

热门文章

  1. ganglia java开发,ganglia分布式监控部署
  2. FFmpeg从入门到入魔(1):初探FFmpeg框架
  3. readdir函数 php,php readdir函数怎么用
  4. GYP,GN和Ninja
  5. android下雪动画图片,CSS3 下雪的背景动画
  6. el-popover弹出框增加右键点击事件
  7. 【批处理】attrib
  8. RenderControl (asp.net)
  9. 63-Linux如何解决僵死进程
  10. 学习UpdatePanel控件-