Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >链表的基本操作

链表的基本操作

作者头像
pigeon
发布于 2022-04-11 11:40:40
发布于 2022-04-11 11:40:40
3680
举报
文章被收录于专栏:电子荣耀电子荣耀

1、定义链表结点类型

链表的基本操作

单向链表的主要操作包括:建立链表、向链表中插入和删除结点、遍历链表等。下面通过一个简单实例简要介绍单向链表的基本操作。

【例1】使用链表存放多个商品的资料,每个商品包括:商品编号和商品价格。

1、定义链表结点类型

程序中如果要使用链表,首先要定义描述链表结点的结构体类型,下面给出本例中结点的结构体定义:

struct product

{

int id;//商品编号

double price;//商品价格

struct product *next;//指针域

};

typedef struct product NODE;//为结点起别名

2.建立链表

建立链表是指在程序运行过程中,从无到有地建立起链表的过程。即逐个为结点分配内空间,输入结点数据,并建立起结点之间的前后链接关系。

下面给出建立链表的函数 create的定义,链表中结点的排列是按照数据输入的先后顺序,即后输入的数据排在链表的末尾,链表的头指针以函数返回值形式得到

函数的源代码如下:

NODE *create()

{

NODE *head, *tail,*p; //head-头指针,tail-尾指针

int id;

double price;

head=NULL; //头指针置为NULL,表示链表是空表

printf("输入编号和价格(编号为0表示结束):");

scanf("% d% If", &id, &price);

while(id>0)

{

p=(NODE *)malloc( sizeof(NODE));//分配一个结点的内存空间

//下面为结点成员赋值

p->id=id;

p->price=price;

p->next=NULL;

//下面if语句把新结点连接到链表的最后面

if(head==NULL)

{

head=p;//当链表为空时,新结点是第1个结点

}

else

{

tail->next=p;//链表不为空时,把新结点连接在原尾结点后面

}

tail=p; //tail指向新的尾结点

printf("输入编号和价格(编号为0表示结束):");

scanf("%d%lf",&id,&price);

}

return head;//返回值是链表的头指针

}

创建链表函数 create的说明:

(1)函数中定义了3个结点类型指针变量:head是链表的头指针;tail在链表建立过程中始终指向链表的末尾一个结点,增加的新结点直接链接到tail结点的后面即可;p指向链表创建过程中新增加的结点。

(2)函数的第6行把头指针head赋值为NULL,表示链表是空链表,即没有任何结点。

(3)创建链表时,每结点都要单独分配内存空间。函数第11行进行内存分配,循环每进行一次,就创建一个新结点。

(4)链表中第一个结点的创建与其他结点是不同的,直接让头指针head指向它即可(第19行),而其他结点需要链接到tail指针的后面(第23行)。

(5)循环中每次创建一个新结点并链接到链表尾部后,tail指向的结点就不再是尾结点,需要让tail指向新的尾结点(第25行)

(6)函数 create创建的链表返回给调用它的主调用函数时,只需要将头指针head作为函数的返回即可(第29行)。

(7)在main函数调用 create函数建立一个链表可以使用如下语句

NODE *head;//在main函数中定义头指针变量

head=create();//调用 create函数创建链表,并把链表的头指针赋值给head。

3.遍历链表

链表的遍历操作是指从链表的第1个结点开始,依次对链表中每一个结点进行一次访问,直到链表的结束为止。遍历链表使用循环结构实现,首先使指针p指向第1个结点,通过p对结点进行访问,访问完成后,使指针p指向下一结点。如此不断循环,直到链表结束(p为NULL)为止。

遍历操作中对结点的访问是一个通用概念,对结点的访问可以是:输出结点的数据域、修改结点数据域、对结点计数、对结点数据进行判断等。下面给出对链表进行输出和计数两种操作的函数。

输出链表所有结点的函数display的源代码如下:

void display( NODE *h)

{

NODE *p;

p=h;//p指向第1个结点

printf("-----------------------\n");

whilel(p!=NULL)//结束条件是p为NULL

{

printf("%10d, %10. 2f\n",p->id, p->price);

p=p->next;//使p指向下一个结点

}

printf("-----------------------\n");

}

输出链表函数 display几个关键地方:

(1)函数的参数h表示要输出的链表的头指针。

(2)指针p指向第1个结点,见代码第4行。

(3)判断链表是否结束的条件是p!=NULL,如果条件不成立,表示链表已经遍历完成。

(4)代码中第9行作用是使指针p指向它目前指向结点的下一个结点,该语句保证了循环是依次访问链表的所有结点,并能够到达链表末尾。

例如,main函数中已经建立一个头指针为head的链表,可以使用如下语句输出所有结点

display(head);//输出头指针head指向的链表

统计一个链表中结点的个数也是一种遍历操作,下面定义的函数 count的功能中统计个链表中共有多少个结点,函数的返回值是结点的个数。

int count( NODE *h)

{

NODE *p;

int n=0;

while(p!=NULL)

{

n++;

p=p->next;

}

return n;

}

main函数中使用如下语句可以得到头指针head指向的链表中结点个数:

int num=count(head);

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-01-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 电子荣耀 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
数据结构 | 单链表
这是百度百科对于 单链表 的解释,通俗来说,单链表 就是一种数据结构,它包含了一个 数据域 data 和一个 指针域 next ,最大的特点就是 链式存储 。链表有很多种,其中 单链表 是最基本、最简单的一种结构,很多OJ题都会利用 单链表 出题,后面的部分高阶数据结构也会用到 单链表 ,因此学好 单链表 很重要。除了 单链表 外,还有 双向带头循环链表 (后面会介绍)等链表类型,先来进入 单链表 的学习吧!
北 海
2023/07/01
1500
数据结构 | 单链表
[数据结构]——单链表——超详解
总之,该函数的核心思想是找到要删除的结点的前一个结点,然后通过修改前一个结点的指针来实现删除操作。
小李很执着
2024/06/15
1020
[数据结构]——单链表——超详解
链表的基本操作_简单链表
链表是环环相扣的,head头指针指向头结点,头结点指向首元结点,首元结点指向第二个结点…直到最后的结点。
全栈程序员站长
2022/11/15
6270
链表的基本操作_简单链表
链表操作详解
单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据 ————百度百科
用户11029129
2024/06/04
1080
链表操作详解
循环链表练习(一)--约瑟夫环
  约瑟夫环问题,是一个经典的循环链表问题,题意是:已知 n 个人(分别用编号 1,2,3,…,n 表示)围坐在一张圆桌周围,从编号为 k 的人开始顺时针报数,数到 m 的那个人出列;他的下一个人又从 1 开始,还是顺时针开始报数,数到 m 的那个人又出列;依次重复下去,直到圆桌上剩余一个人。 如图所示,假设此时圆周周围有 5 个人,要求从编号为 3 的人开始顺时针数数,数到 2 的那个人出列:
嵌入式与Linux那些事
2021/05/20
3850
循环链表练习(一)--约瑟夫环
线性表,双向链表,静态链表,循环链表(约瑟夫环)
通过前面的学习我们知道,具有“一对一”逻辑关系的数据,最佳的存储方式是使用线性表。那么,什么是线性表呢? 线性表,全名为线性存储结构。使用线性表存储数据的方式可以这样理解,即“把所有数据用一根线儿串起来,再存储到物理空间中”。
zhangjiqun
2024/12/14
1200
线性表,双向链表,静态链表,循环链表(约瑟夫环)
2-2 学生成绩链表处理 (20 分)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
韩旭051
2019/11/08
1.5K0
一步一步教你从零开始写C语言链表
2、解决数组中,元素个数无法改变的限制(C99的变长数组,C++也有变长数组可以实现)。
杨源鑫
2019/07/04
8880
一步一步教你从零开始写C语言链表
【单链表】大数据,请把它推给还不会单链表的人
2.其实计算机中并没有指针的指向,箭头指向只是人为假象出来的,实际上指针域存储的是下一个结点的地址。
MicroFrank
2023/01/16
2130
C++ "链链"不忘@必有回响之双向链表
单链表中,查询一个已知结点的后驱结点的时间复杂度为O(1)。因结点本身不存储与前驱结点相关的地址信息,查询前驱结点需要从头结点扫描一次,时间复杂度为O(n)。
一枚大果壳
2022/12/20
2520
C++ "链链"不忘@必有回响之双向链表
链表面试题(动图详解)-明明做出来了却为什么没有Offer?
面试题明明做出来了,为什么最后没有Offer? 虽然实现了功能,但是可能忽略了性能和细节,比如说复杂度、边界条件、空指针等。就是所谓的鲁棒性(Robus)问题,本文将介绍几个经典链表面试题。
唔仄lo咚锵
2022/05/08
4430
链表面试题(动图详解)-明明做出来了却为什么没有Offer?
【数据结构】C语言实现带头双向循环链表万字详解(附完整运行代码)
要编写一个带头双向循环链表项目,首先要明确我们想要达到的效果是什么样,下面我将用vs2022编译器来为大家演示一下带头双向循环链表程序运行时的样子:
修修修也
2024/04/01
2390
【数据结构】C语言实现带头双向循环链表万字详解(附完整运行代码)
超详细的单链表学习(二)
----昨天跟大家分享了单链表的一些基本用法,今天接着继续和大家分享单链表的用法,今天分享完,单链表的操作就暂告一段落了,后面接着分享双链表的学习和实战! 一、单链表的遍历: 1、什么叫遍历? 遍历就是把单链表中的各个节点挨个拿出来,就叫遍历。 2、如何来遍历单链表? 从头指针+头节点开始,顺着链表挂接指针依次访问链表的各个节点,取出这个节点的数据,然后再往下一个节点,直到最后一个节点,结束访问。 3、注意事项: 一是不能遗漏元素,二是不能重复、追求效率 4、实战代码演示:
用户6280468
2022/03/18
2290
链表问题——长整数加法运算题解【双向链表】
假设2个任意长度的整数x、y分别用链表A和B存储,现要求设计一个算法,实现x+y。计算结果存储在链表C中。
来杯Sherry
2023/07/09
3180
链表问题——长整数加法运算题解【双向链表】
SDUT 2019 级程序设计基础(B)II 实验2–链表
尾插法建表可以很形象的理解成每个新结点都插在尾巴后,尾巴由tail标识,而新结点的插入导致原尾结点不是尾巴了,新插入的p成为新尾巴,所以每次都要进行上面这些操作(更新尾巴 尾巴的next为NULL)
Here_SDUT
2022/06/29
3060
SDUT 2019 级程序设计基础(B)II 实验2–链表
数据结构-线性表|顺序表|链表(下)
1 1 1 哈喽。各位小伙伴好久不见,热心的小编赶在开学季又来给大家送上满满的干货了。祝大家开心快乐! 继上两次咱们聊了顺序表、单链表、静态链表等知识。那么热爱学习的小编这次又来给大家推送新的知识了,今天要讲的知识是循环链表和双向链表,这节讲完,线性表这部分就算完结撒花了。好了,废话不多说,咱们开始学习吧…… * 内容提要: *预备知识 *顺序表(Sequential List) *单链表(Singly Linked List ) *静态链表(Static list ) *循环链表(circular lin
用户1621951
2018/04/19
7180
数据结构-线性表|顺序表|链表(下)
【数据结构】单链表的增删改查
单链表需要使用的函数指针操作小技巧计算单链表的长度创建单链表单链表插入数据单链表删除数据效率分析
程序员周同学
2019/07/27
1.7K0
数据结构:线性表之链式存储结构
为了表示每个数据元素ai与其直接后继元素ai+1之间的逻辑关系,对数据ai,除了存储其自身的信息之外,还需存储一个指示其 直接后继的信息(即直接后继的存储位置)。这两部分信息组成数据元素ai的存储映像
s1mba
2018/01/03
1K0
数据结构:线性表之链式存储结构
链表面试题
https://leetcode.cn/problems/middle-of-the-linked-list/
小李很执着
2024/06/15
860
链表面试题
数据结构:链表
工程代码 Github: Data_Structures_C_Implemention -- Link List
半纸渊
2018/08/30
9821
数据结构:链表
推荐阅读
相关推荐
数据结构 | 单链表
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档