单链表操作实现getelem_c语言实现--带头结点单链表操作

可能是顺序表研究的细致了一点,单链表操作一下子就实现了。这里先实现带头结点的单链表操作。

大概有以下知识点.

1;结点:结点就是单链表中研究的数据元素,结点中存储数据的部分称为数据域,存储直接后继地址的部分称为指针域。

2;结点示意图:

3;头指针:头指针始终指向链表第一个元素,当有头结点时头结点就是链表第一个元素。头指针具有标识左右,故头指针命名为链表的名字,这里为linklist。头指针是一定存在的。

4;头结点:引入头结点的目的是,将链表首元结点的插入和删除操作与其他结点的插入和删除操作统一起来。(即头指针地址不在发生变化)

5;单链表结点结构体表示:

1 structLNode2 {3 int data; //姑且认为其数据为整型

4 struct LNode *next;5 };6

7 typedef struct LNode * linklist

6;单链表的操作集合,头文件 defs.h

1 #ifndef _DEFS_H_2 #define _DEFS_H_

3

4 #include

5 #include

6 #include

7

8 struct LNode //单链表结点的定义

9 {10 intdata;11 struct LNode *next;12 }13 typedef struct LNode *linklist14

15 //操作集合

16 void InitList(linklist *L); //申请头结点,头指针地址改变

17 void DestroyList(linklist *L); //须释放头结点,头指针地址改变

18 void ClearList(linklist L); //保留头结点,头指针地址不变

19 voidListEmpty(linklist L);20 intListLength(linklist L);21 int GetElem(linklist L, int i, int *e);22 int LocateElem(linklist L, inte);23 int PriorElem(linklist L, int cur_e, int *pri_e);24 int NextElem(linklist L, int cur_e, int *nex_e);25 int ListInsert(linklist L, int i, int e); //插入不改变头指针的值

26 int ListDelete(linklist L, int i, int *e); //删除操作也不改变头指针的值

27 voidTravelList(linklist L);28 #endif

7;InitList操作实现

1 #include"defs.h"

2

3 void InitList(linklist *L) //接受头指针的地址值

4 {5 *L = (linklist)malloc(sizeof(struct LNode)); //*L表示头指针

6

7 if (*L ==NULL)8 {9 printf("分配结点失败。\n");10 exit(-1);11 }12 (*L)->next = NULL; //置头结点的next域为空

13 }

InitList.c

8;DestroyList操作的实现

1 #include"defs.h"

2

3 void DestroyList(linklist *L) //接受的参数为头指针的地址值

4 {5 linklist p ;6 while (*L)7 {8 p = (*L)->next; //释放结点之前先保存结点的下一个地址,防止线索被断

9 free(*L);10 *L = p; //将下一个结点,作为释放结点

11 }12 }

DestroyList.c

9;ClearList操作的实现

1 #include"defs.h"

2

3 void ClearList(linklist L) //保留头结点

4 {5 linklist p = L->next; //p将头指针的next值保存起来,p指向首元结点

6 L->next =NULL;7

8 DestroyList(&p); //调用撤销函数,释放后面的结点

9

10 }

ClearList.c

10;ListEmpty操作的实现

1 #include"defs.h"

2

3 voidListEmpty(linklist L)4 {5 if (L->next == NULL) //判断头结点指针域是否为空

6 printf("链表为空.\n");7 else

8 printf("链表不为空.\n");9 }

ListEmpty.c

11;ListLength操作实现

1 #include"defs.h"

2

3 intListLength(linklist L)4 {5 int j=0; //作为计数器

6 linklist p = L->next; //p指向首元结点,作为移动指针

7

8 while (p) //从首元结点开始

9 {10 ++j;11 p = p->next;12 }13 returnj;14 }

ListLength.c

12;GetElem操作实现

1 #include"defs.h"

2

3 int GetElem(linklist L, int i, int *e) //1<= i <=ListLength(L)

4 {5 int j = 0; //j作为计数器

6 linklist p =L;7

8 while (p && j

9 {10 ++j;11 p = p->next;12 }13 if (!p || i<1) //取值位置不合理

14 exit(0);15

16 *e = p->data;17 return 0;18 }

GetElem.c

13;LocateElem操作实现

1 #include"defs.h"

2

3 int LocateElem(linklist L, inte)4 {5 linklist p = L->next; //p作为移动指针,p指向第一个元素

6 int j = 0; //j作为计数器

7

8 while(p)9 {10 ++j;11 if (p->data ==e)12 returnj;13 p = p->next;14 }15 return 0;16 }

LocateElem.c

14;PriorElem操作实现

1 #include"defs.h"

2

3 int PriorElem(linklist L, int cur_e, int *pri_e) //第一个元素无前驱

4 {5 linklist p = L->next; //p指向首元结点

6 linklist q;7

8 while(p)9 {10 q = p->next; //q为p的后继

11

12 if (q && q->data == cur_e) //则p就是q的前驱

13 *pri_e = p->data;14 p = q; //循环

15 }16 return 0;17 }

PriorElem.c

15;NextElem操作的实现

1 #include"defs.h"

2

3 int NextElem(linklist L, int cur_e, int *nex_e) //最后一个元素无后继

4 {5 linklist p = L->next; //p指向首元结点

6 linklist q;7

8 while(p)9 {10 q = p->next; //q为p的后继

11

12 if (q && p->data == cur_e) //p有后继,且p的数据域与当前值相等

13 *nex_e = q->data;14 p = q; //更新p

15 }16 return 0;17 }

NextElem.c

16;ListInsert操作的实现

1 #include"defs.h"

2

3 int ListInsert(linklist L, int i, int e) //1<= i <= ListLength(L)

4 {5 int j=0; //j为基数器

6 linklist p = L; //p为移动指针,p指向头结点

7 linklist q, s;8

9 while (p && j

10 {11 ++j;12 p = p->next;13 }14

15 if (!p || i<1) //插入位置不合理

16 return 0;17

18 q = p->next; //q指向第i个结点

19

20 s = (linklist)malloc(sizeof(structLNode));21 if (!s) //分配失败

22 exit(-1);23

24 s->data = e; //置s的数据域为e

25 s->next = q; //插入操作,是指针连起来

26 p->next =s;27 return 0;28 }

ListInsert.c

17;ListDelete操作的实现

1 #include"defs.h"

2

3 int ListDelete(linklist L, int i, int *e) //1<= i <=ListLength(L)

4 {5 int j = 0; //j为计数器

6 linklist p =L;7 linklist q;8

9 while (p && j

10 {11 ++j;12 p = p->next;13 }14

15 if (!p || i<1) //删除位置不合理

16 exit(0);17 q = p->next; //q指向第i个结点

18

19 *e = q->data; //先将第i个结点的数据域带出

20 p->next = q->next; //连起指针

21 free(q); //释放第i个结点

22

23 return 0;24 }

ListDelete.c

18;TravelList操作实现

1 #include"defs.h"

2

3 voidTravelList(linklist L)4 {5 linklist p = L->next; //p指向首元结点

6 int j = 0; //j为计数器

7

8 while(p)9 {10 ++j;11 printf("第%d个结点的数据域的值为:%d\n", j, p->data);12 p = p->next; //更新p

13 }14 }

TravelList.c

19;makefile的实现,其代码与顺序表的一样,这里换成另一种写法

1 object =main.o InitList.o DestroyList.o ClearList.o ListEmpty.o \2 ListLength.o GetElem.o LocateElem.o PriorElem.o NextElem.o \3 ListInsert.o ListDelete.o TravelList.o4

5 test : $(object)6 gcc -g -Wall -o test $(object)7

8 $(object) : defs.h9

10 .PHONY : clean11 clean :12 rm -f *.o

20;顺序表与单链表的比较

顺序表是用一段地址连续的存储单元来存放数据元素,适合查找,不适合频繁插入和删除(没一次操作都是O(n));

单链表是用不连续的存储单元,其数据元素之间是用指针来连接,每一次的查找都必须通过头指针来遍历,因此其不适合频繁的查找。但是对于插入和删除操作,它不需要移动其它元素,算法时间复杂度为O(1),因此特别适合频繁的插入和删除操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/551631.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php ouput buffer,Redis配置详解-客户端缓冲区 output buffer

客户端缓冲区 output buffer大概已经知道Redis是一个内存数据库&#xff0c;这意味着所有的数据都由RAM直接管理和提供的。因此Redis有着卓越的交付性能&#xff0c;Redis可以以亚毫秒级的延迟处理几万、几十万的请求。Redis&#xff0c;如同它的名字和设计&#xff0c;是一个移…

python布尔测试_Python布尔函数:用真值优化代码

Python布尔类型是Python的内置数据类型之一。它用来表示表达式的真实值。例如&#xff0c;表达式1<2为True&#xff0c;而表达式01为False。了解Python布尔值的行为对于在Python中良好编程是非常重要的。Python布尔类型Python布尔类型只有两个可能的值&#xff1a;TrueFalse…

结构体中vector自动为0_面试题:你是如何选择顺序存储数据结构的?

作者&#xff1a;Tarun Telang 来源&#xff1a;https://dzone.com/articles/arraylist-or-linkedlist本文为Java开发人员选择适当的顺序数据结构提供指导。ArrayList 和 LinkedList 是 Java 集合框架中用来存储对象引用列表的两个类。ArrayList 和 LinkedList 都实现 List 接口…

python 公开课_python公开课视频(11~20)

Python基础教程视频教程 各集内容简介 通俗易懂&#xff0c;语言简练&#xff0c;保证入门。 11. Python基础教程视频教程 第 11 集 Python的分支语句if基础 本集主要讲述Python条件分支语句if的基本使用和语法结构&#xff0c;if嵌套和多分支if语句程序设计等问题。 12. Pytho…

oracle 随机排列,oracle的随机排序

oracle的随机排序项目里一个功能要用到随机排序&#xff0c;但是后来又因为数据量大的原因&#xff0c;要分页去查询数据&#xff0c;结果导致查询出来的数据出现重复。原sql如下select * from ( select row_.*, rownum rownum_ from(select * from tble order by dbms_random.…

c# 低功耗蓝牙_c# - 如何使用C#手动绑定到WinForm中的蓝牙低能耗设备? - 堆栈内存溢出...

我想到了。 我走在正确的轨道上。使用以下连接后&#xff1a;var dev await BluetoothLEDevice.FromBluetoothAddressAsync(args.BluetoothAddress);您需要执行自定义配对&#xff1a;var prslt await device.DeviceInformation.Pairing.Custom.PairAsync(DevicePairingKinds…

python字典求平均值_Python - 字典中各个键的每个值的均值

我在跨整个字典进行迭代时遇到问题&#xff0c;无法对键的值中的每个元素进行简单的汇总统计&#xff08;平均值&#xff09;。Python - 字典中各个键的每个值的均值 我的字典由那些号码清单键和值&#xff1a; test_dict{NJ:[20,50,70,90,100],NY:[10,3,0,99,57],CT:[90,1000,…

数字填图问题matlab上机实验报告,数学建模实验报告数字填图问题

数字填图问题一、实验目的及意义本实验旨在通过生活中几个常见的数字填图问题的探究&#xff0c;探究这类问题的逻辑推理解法和计算机解法&#xff0e;二、实验内容1. 数字填图的逻辑推理&#xff1b;2. 数字填图的计算机解法。三、实验步骤1.开启软件平台——MA TLAB&#xff…

c++ 函数指针_进化论——从函数指针到被结构封装的函数指针及参数的应用举例...

↑↑↑ 点击上方公众号名称关注&#xff0c;不放过任何转变的机会。✎ 编 者 悟 语借口再小也会瓦解人的意志。文 章 导 读今天带大家用下函数指针&#xff0c;然后将函数指针和函数参数封装到结构体中&#xff0c;接着将数据用动态分配和静态分配的方式赋值给相应的函数&#…

domino流程图_OA实施工程师一线解读Java与Domino优劣

南宁OA软件泛微运营中心云腾为您分享&#xff1a;作为企业的CIO&#xff0c;不仅要面对企业内部的各类需求&#xff0c;还需要管理理念以及对市面上的信息化系统和技术了如指掌&#xff0c;否则很有可能在自己的职业生涯中划上遗憾的一笔。固然是吃一堑长一智&#xff0c;但谁不…

oracle中packages使用,oracle中packages的使用

最近&#xff0c;由于开发的功能较多&#xff0c;对于编写的很多过程&#xff0c;看着英文名字觉得挺熟悉&#xff0c;但要看功能&#xff0c;则需要每个点开去开备注或者代码&#xff0c;觉得很是郁闷。突见packages&#xff0c;想将所有写的过程放到一起&#xff0c;这样下次…

python怎么做软件界面_python – 如何自定义桌面应用程序的标题栏和窗口

我如何自定义标题栏(包括&#xff1a;关闭,最大化,最小化按钮,标题)和用PyQt编写的桌面应用程序框架,使其看起来像下面的图像&#xff1f;我需要一种方法来指定我想用于标题栏元素的颜色(按钮,文本标题和条形和按钮的背景颜色).我需要更改其窗口的代码&#xff1a; import sys …

树莓派存储方案_如何增加树莓派的存储量

大多数人仅使用8GB SD卡来运行Raspberry Pi。但这真的够了吗&#xff1f;如果您需要更多空间怎么办&#xff1f;这是通过删除不需要的软件包或简单地添加存储来在Raspbian上腾出更多空间的方法。使用更大的microSD卡您应该考虑在Raspberry Pi上增加空间的第一个选择是更大的SD卡…

linux中进程优先级,linux下调整进程优先级

linux下调整进程优先级进程的优先级决定了进程是否优先被cpu分配资源进行处理。在cpu资源十分充足时&#xff0c;每个正在运行的进程都能分配到足够的资源进行处理&#xff0c;此时调整进程的优先级是没有什么意义的&#xff1b;如果cpu资源紧张时&#xff0c;top查看cpu使用达…

华为交换机 查ip冲突_交换机如何解决IP地址冲突?

如何防止IP地址冲突故障&#xff1f;这个在实际项目中经常会遇到&#xff0c;网络用户如果没有按照规定设置IP地址的话&#xff0c;IP地址冲突现象就不可避免&#xff0c;一旦这种现象频繁发生&#xff0c;不但会影响上网效率&#xff0c;而且也不利于局域网网络的稳定运行。为…

python绘制社会关系网络图_Python networkx 网络图绘制

简单演示import networkx as nx import matplotlib.pyplot as plt # 定义空图 g nx.Graph() # 增加节点 g.add_node(1) g.add_node(A) g.add_nodes_from([2, 3]) g.add_edge(2, 3) g.add_edges_from([(1, 2), (1, 3)]) nx.draw(g, with_labelsTrue) plt.show() 一次增加多个点…

查看LINUX放开端口,linux如何查看端口是否开放?

在linux中我们可以通过在命令行中使用lsof命令、netstat命令来检查端口是否开放。方法一&#xff1a;使用lsof命令我们可以使用lsof命令来检查某一端口是否开放&#xff0c;基本语法如下&#xff1a;lsof -i:端口号如果没有任何输出则说明没有开启该端口号下图以80端口和53端口…

vue如何把数组转为json数组_vue.js,_vuejs Ajax取得一个数据json数组,vue.js - phpStudy...

vuejs Ajax取得一个数据json数组vuejs Ajax取得一个数据json数组后&#xff0c;要通取回的数据再做判断一定只能通这种方式或者 套template标签{{item.displayWords}}{{item.displayWords}}或者{{item.displayWords}}{{item.displayWords}}这样才行吗&#xff1f;&#xff1f;&…

python数据处理框架_python 最快 web 框架 Sanci 快速入门

简介 Sanic 是一个和类Flask 的基于Python3.5的web框架&#xff0c;它编写的代码速度特别快。 除了像Flask 以外&#xff0c;Sanic 还支持以异步请求的方式处理请求。这意味着你可以使用新的 async/await 语法&#xff0c;编写非阻塞的快速的代码。 关于 asyncio 包的介绍&…

linux tcp ip c,Linux下TCP/IP编程--TCP实战(select)

本文参考自徐晓鑫《后台开发》&#xff0c;记录之。一、为什么要使用非阻塞I/O之select初学socket的人可能不爱用select写程序&#xff0c;而习惯诸如connect、accept、recv/recvfrom这样的阻塞程序。当让服务器同时为多个客户端提供一问一答服务时&#xff0c;很多程序员采用多…