顺序表插入、删除时需要通过移动数据来实现,影响了执行效率。

而链表不要求逻辑上相邻的两个数据元素物理上也相邻,因此对线性表的插入、删除不需要移动数据元素,只需要修改链。

下面介绍带头结点的链式表:

数据结构:

typedef int ElementType;
typedef struct LNode * PtrToLNode;
struct LNode{ElementType Data;PtrToLNode Next;
};
typedef PtrToLNode Position;//这里的位置是结点的地址
typedef PtrToLNode List; 

1.初始化:

//初始化
List MakeEmpty(){List L;L = (List)malloc(sizeof (struct LNode));if (!L)exit (-1);L->Next = NULL;return L;
} 

2.求表长

在顺序存储表示的线性表中求表长是一件很容易的事,直接返回Last+1值就可以了,但是在链式存储表示中,需要将链表从头到尾遍历一遍;设一个移动的指针p和计数器cnt,初始化后,p从表的第一个结点开始往后移,同时计数器cnt+1.


//求表长
int Length(List L){Position p;int cnt = 0;p = L->Next;while(p){p = p -> Next;cnt++;}return cnt;
} 

3.查找(按序号查找FindKth)

对于顺序存储,按序号查找是很直接的事,要得到第k个元素的值,直接取L->Data[k-1]就可以了。而对于链式表就需要采用求表长的思路,从头遍历,判断当前结点是否是第K个,若是,返回该结点的值,否则继续后一个。

//根据指定的位序查找s
int FindKth(List L,int K){Position p;int cnt = 1;//位序从1开始 p = L->Next; while(p&&cnt<K){p = p-> Next;cnt++;}if((cnt==K)&&p) printf("您查找的数为:%d\n",p -> Data);else printf("您查找数不存在");
}

4.查找(按值查找Find)

按值查找的方法也是从头到尾遍历,直到找到为止

//按值查找
Position Find(List L,int X){Position p;p = L->Next; while(p&&p->Data!=X){p = p-> Next;}if(p) printf("查找成功,您查找的数为:%d\n",p->Data);else printf("您查找数不存在");
}

5.插入

带头结点的链式表的插入

//插入
List Insert(List L ,ElementType X,int i){Position tmp,pre;int cnt =0 ;pre = L;while(pre&&cnt<i-1){pre = pre->Next;cnt++;}if(pre==NULL||cnt!=i-1){printf("插入位置参数错误\n");}else{tmp = (Position)malloc(sizeof(struct LNode));tmp->Data=X;tmp->Next=pre->Next;pre->Next=tmp;}} 

6.删除

删除指定位序i的元素,首先需要找到被删除结点的前一个元素,然后再删除结点并释放空间。

//删除
bool Delete(List L,int i){Position tmp,pre;int cnt = 0;pre = L;while(pre&&cnt<i-1){pre=pre->Next;cnt++;}if(pre==NULL||cnt!=i-1||pre->Next==NULL){printf("删除位置参数错误");}else{tmp = pre->Next;pre->Next = tmp->Next;free(tmp);printf("删除成功"); }
} 

7.遍历链表并输出

void DisLinkList(List L)
{List p = L->Next;printf("输出链表: "); while (p){printf("%d ", p->Data);p = p->Next;}
}

完整的程序代码:

#include<stdio.h>
#include<stdlib.h>
typedef int ElementType;
typedef struct LNode * PtrToLNode;
struct LNode{ElementType Data;PtrToLNode Next;
};
typedef PtrToLNode Position;//这里的位置是结点的地址
typedef PtrToLNode List;
//初始化
List MakeEmpty(){List L;L = (List)malloc(sizeof (struct LNode));if (!L)exit (-1);L->Next = NULL;return L;
} //根据指定的位序查找
int FindKth(List L,int K){Position p;int cnt = 1;//位序从1开始 p = L->Next; while(p&&cnt<K){p = p-> Next;cnt++;}if((cnt==K)&&p) printf("您查找的数为:%d\n",p -> Data);else printf("您查找数不存在");
}//按值查找
Position Find(List L,int X){Position p;p = L->Next; while(p&&p->Data!=X){p = p-> Next;}if(p) printf("查找成功,您查找的数为:%d\n",p->Data);else printf("您查找数不存在");
}//插入
List Insert(List L ,ElementType X,int i){Position tmp,pre;int cnt =0 ;pre = L;while(pre&&cnt<i-1){pre = pre->Next;cnt++;}if(pre==NULL||cnt!=i-1){printf("插入位置参数错误\n");}else{tmp = (Position)malloc(sizeof(struct LNode));tmp->Data=X;tmp->Next=pre->Next;pre->Next=tmp;}} //删除
bool Delete(List L,int i){Position tmp,pre;int cnt = 0;pre = L;while(pre&&cnt<i-1){pre=pre->Next;cnt++;}if(pre==NULL||cnt!=i-1||pre->Next==NULL){printf("删除位置参数错误");}else{tmp = pre->Next;pre->Next = tmp->Next;free(tmp);printf("删除成功"); }
} //求表长
int Length(List L){Position p;int cnt = 0;p = L->Next;while(p){p = p -> Next;cnt++;}return cnt;
} void DisLinkList(List L)
{List p = L->Next;printf("输出链表: "); while (p){printf("%d ", p->Data);p = p->Next;}
}int main(){Position pre;Position L = MakeEmpty();pre = L;int i,n,x,len,cz,del;//插入 scanf("%d",&n);for(i=1;i<=n;i++){scanf("%d",&x);Insert(pre,x,i);}//输出 DisLinkList(pre);printf("\n");//求表长 len = Length(L);printf("表长为:%d",len);printf("\n");//按值查找printf("请输入你要按值查找的数:\n");scanf("%d",&cz);Find(L,cz);printf("\n");//按序号查找printf("请输入你要按序号查找的数的序号:\n");scanf("%d",&cz);FindKth(L,cz);printf("\n");//删除printf("请输入你要删除的数的下标:\n",del);scanf("%d",&del);Delete(L,del);DisLinkList(pre);printf("\n");return 0;
}

运行结果:

数据结构之线性表的链式存储实现(附完整代码)相关推荐

  1. Python 数据结构 之 线性表 的链式存储结构

    用Python 来实现 C语言中 线性表的链式存储结构. 文章转载请注明:  Python 数据结构 之 线性表 的链式存储结构 代码地址 https://github.com/WenkeZhou/P ...

  2. 【数据结构】线性表的链式存储-单链表

    单链表的定义 线性表的链式存储又称为单链表,它是指通过一组任意的存储单元来存储线性表中的数据元素. 为了建立起数据元素之间的线性关系,对每个链表结点,除了存放元素自身的信息之外,还需要存放一个指向其后 ...

  3. 用Java描述数据结构之线性表的链式存储(链表),模拟LinkedList实现

    上一篇介绍了顺序表:用Java描述数据结构之线性表的顺序存储(顺序表),ArrayList及其方法的介绍 上一篇博客中说明了什么是线性表--线性表就是一个个数据元素逻辑上以一对一的相邻关系(但是在物理 ...

  4. 【数据结构】线性表的链式存储-双链表

    引言 单链表结点中只有一个指向其后继的指针,这使得单链表只能从头结点依次顺序地向后遍历.若要访问某个结点的前驱结点(插入.删除操作时),只能从头开始遍历 ,访问后继结点的时间复杂度为 0(1),访问前 ...

  5. 线性表(链式存储结构)C语言

    文章目录 一.线性表的链式存储结构 二.代码 1.头文件与宏定义: 2.对链表的定义及主要使用函数: 3.测试函数(主函数): 三.运行结果 一.线性表的链式存储结构 线性表的链式存储结构的特点是用一 ...

  6. 数据结构和算法:(3)3.2线性表的链式存储结构

    线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素也就是说你这个可以放在A地点,这个可以放在E地点,A地点和E地点中间可以隔开一个C地点和D地点,这样是允许的),这组存储单元可以存在 ...

  7. 从零开始学数据结构和算法(二)线性表的链式存储结构

    链表 链式存储结构 定义 线性表的链式存储结构的特点是用一组任意的存储单元的存储线性表的数据元素,这组存储单元是可以连续的,也可以是不连续的. 种类 结构图 单链表 应用:MessageQueue 插 ...

  8. 《数据结构》c语言版学习笔记——其他链表(线性表的链式存储结构Part2)

    线性表的链式存储结构 数据结构系列文章 第三章 循环链表.双向链表 文章目录 线性表的链式存储结构 前言 一.循环链表 (一)定义 (二)尾指针 二.双向链表 (一)定义 (二)代码 总结 前言 提示 ...

  9. 《数据结构》c语言版学习笔记——单链表结构(线性表的链式存储结构Part1)

    线性表的链式存储结构 数据结构系列文章 第二章 单链表结构 文章目录 线性表的链式存储结构 前言 一.单链表的建立 代码 二.单链表的读取 代码 三.单链表的插入 代码 四.单链表的删除 代码 五.单 ...

最新文章

  1. ubuntu 安装 anaconda
  2. boost::mp11::mp_filter相关用法的测试程序
  3. c语言整行乘非整形等于什么意思,C语言--整形升级寻常算术转换
  4. SpringAOP 注解方式代码示例
  5. 优化浏览器默认scroll样式小技巧
  6. 都在发5G手机,现在买4G手机还合算吗?
  7. 最新,最详细的LINUX图文配置教程|之DNS篇(1)
  8. 酒后谈IT,那些术语大妈都能秒懂!
  9. 树莓派(zero w)——硬件介绍与系统开机
  10. python群发邮件
  11. 003_SSS_ Tackling the Generative Learning Trilemma with Denoising Diffusion GANs
  12. 2021-07-28 Python爬虫
  13. 人工智能产业链基本介绍,人工智能技术划为哪几部分?
  14. 应用ArcGIS和COORD软件进行坐标七参数转换的方法
  15. Element table 导出Excel重复数据
  16. 支持DoH的DNS服务器,谷歌公共 DNS 服务器正式支持 DoH 加密
  17. 服务器 国产CPU 什么型号,国产cpu服务器
  18. 012 相关性与线性表示总结;向量组的秩、向量组等价
  19. PacBio下机数据解读
  20. Python学习 Day38 jQuery常用方法03

热门文章

  1. java中的(~)运算符原理
  2. 关于使用分页之后的页码显示不正常问题
  3. Hust oj 1673 2013新的旅程(水题)
  4. wps2019不能用自网站的数据_抖音运营常用的8个数据分析网站,自媒体小白必备...
  5. golang学习之gorm(一):Gorm介绍
  6. MacBooster 7如何卸载?
  7. 中忻嘉业:抖音小黄车卖货的技巧
  8. 第一次进入外包公司的感受
  9. 无法重现一些战利品_命运比战利品箱还糟
  10. 汽车金融软件解决方案:助力行业适应产业变化完成产业升级