参考文献

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

部分资料转自互联网各类技术博客,内容有一定改动,并非全文转载。本人尊重各位的知识成果,大幅引用的文章原文网址已在各小节末尾给出。
——
C语言在线运行工具:https://tool.lu/coderunner/

1链表简介

由n(n≥0)个数据特性相同的元素构成的有限序列称为线性表。链表即线性表的链式表示和实现。

链表(Linked List)是一种物理存储单元上非连续、非顺序的数据结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。

链表由一系列结点(node,链表中每一个元素称为结点)组成,每一次为一个结构体 动态分配的内存空间,可称之为一个结点,每个结点之间可以是不连续的,但结点内是连续的。结点个数是不受限定的,可以随时删改,这是与数组相比的优点。

结点由指针域数据域构成。存储数据元素信息的成员项称为数据域;存放下一结点的首地址的成员项被称为指针域,存储信息称为指针。第n个结点的指针域内存入第n+1个结点的首地址,如此串联下去直到最后一个结点,即尾结点,没有直接后继,其指针域为NULL,被称为空指针,表示该链表结束。

如果链表的每一个结点只有一个指针,则称为单链表(单向链表)。单链表分为两种:不带头结点的链表和带头结点的链表
所有的链表都有一个头指针 head,头指针具有标识一个单链表的作用,整个单链表的存取必须从头指针开始进行,头指针指示链表的第一个结点,即首元结点
在首元结点之前附加一个结点,称作头结点,可以不存储数据,也可存储附加信息。无论是否有头结点,头指针始终指向链表的第一个结点。如果有头结点,头指针就指向头结点。不带头结点时,这时链表直接在首元结点存入数据,那么当从头插入数据时,head需要时刻变化。因此带头结点的链表性能更优良。

图中每个节点,an表示数据,^表示NULL。

深刻理解:带头结点和不带头结点的区别 使用头结点的优势

2链表的使用

对链表的使用涉及到内存的动态分配。
下面介绍如何新建一个动态单链表以及对该链表的主要操作。

2.1线性表的链式储存结构的类型定义

单链表在C语言中可用结构指针来描述。

#define int ElemType;    //数据域data用通用类型标识符ElemType表示
typedef struct LNode{ElemType data;  //数据域,存放元素值struct LNode *next;//指针域,指向后继结点
}LNode,LinkList;
Linklist L;//头指针L
LNode *p;//工作指针P

工作指针是指向单链表中任意结点的指针变量。

2.2单链表的建立

在单向链表中插入结点,先要确定插入的位置。当待插结点插在工作指针p所指的结点之前称为前插(头插法);当待插结点插在工作指针p所指的结点之后称为后插(尾插法)。

这里展示用尾插入法建立带头结点的单链表(正序建立),为了使新结点能够插入到表尾,除了头指针L、指向新建结点的指针P,还需增加一个始终指向尾结点的尾指针s

  1. 建立头结点,并将头指针(L)指向头结点,头结点的指针域写NULL;
  2. 利用一个工作指针(p),从头到尾依次指向链表中的每个结点。生成一个新结点,用p指向该结点,并向数据域写数据,指针域写NULL;
  3. 将上一步生成的新结点插入表尾,新结点的地址赋给前一个地址的指针域;
  4. 将第二个生成的新结点插入在第一个结点后,重复第二到第四步,使新结点总是插在当前链表的表尾,便可建立一个含有n个结点的单链表。

尾插法算法实现

int CreateListTail(Linklist &L,int n){LNode *s,*p;L=(Linklist *)malloc(sizeof(LNode));//创建头结点L->next = NULL; //将头结点next域置空s=L;//s,l同时指向头结点,开始时头结点和尾结点是同一个for(int i=0;i<n;i++){p=(LNode *)malloc(sizeof(LNode));//创建数据结点,函数malloc分配了一个LNode类型的结点空间,并将其首地址存入指针变量p中scanf("%d",&p->data);s->next=p;//新结点插入到当前链表的表尾s=p;//使s指向尾结点}}

头插法和尾插法建立单链表

2.3单链表的遍历

利用一个工作指针p,从头到尾依次指向链表中的每个结点,当指针指向某个结点时,就输出该结点数据域中的内容,直到指针为空。如果是空链表,就只输出有关信息并返回调用函数。

遍历算法实现

int DisplayList( LinkList L )
//遍历带头结点的单链表
{LNode *p =L->next ;//工作指针p初始化
while ( p!=NULL ){ printf("%d",&p->data);p=p->next;}
}

2.4单链表的查找

不同于顺序表,链表不是随机存储结构,只能从链表首元结点出发,顺着指针域逐个结点向下查找。
有以下几种查找项:

  1. 按序号查找
  2. 按值查找
  3. 相等的结点个数
  4. 最大值/最小值

下面介绍按值查找的算法思路:
从首元结点出发,逐个将结点的值与给定值做比较,若有结点值相等,则返回首次找到的值相等的结点的储存位置;若到尾结点都没有找到,返回0。

按值查找算法实现

int getelem2(Linklist L, ElemType e)
{int i=0;Lnode *p = L->next;while (p!=NULL&&p->data!=e){p = p->next;i++;}if(p!=NULL)return(i);else return p,i;
}

2.5单链表的插入

在链表中第i个位置之前插入数据元素e,即插入到结点ai-i和ai之间。

  1. 查找第i-1个结点的地址,并使工作指针p指向第i-1个结点的地址;
  2. 生成一个数据域为e的新结点*s;
  3. 使新结点s的指针域指向结点ai
  4. 使结点*p的指针域指向新结点s;

    插入算法实现
int ListInsert(LinkList &L,int i ,ElemType e)
{LNode *p,*s;
p = L;
int j = 0;
while (p && j<i-1) //寻找第i-1个结点{p = p->next;++j;}
if (!p || j >i)return ERROR;  //第i个元素不存在s = (LNode)malloc(sizeof(Node)); //生成新的结点
s->data = e;
s->next = p->next;  //将p的后继结点赋值给s的后继
p->next = s;  //将s赋值给p的后继
return OK;
}

如果表中有n个结点,则插入操作中合法的插入位置有n+1个,即1≤i≤n+1。当i=n+1时,新结点则插在链表尾部。

2.6单链表的删除

删除单链表上第i个结点ai

为了删除单向链表中的某个结点,首先要找到待删除结点的前趋结点,然后将此前趋结点的指针域去指向待删除结点的后继结点(p->next=q->next),最后释放被删除结点所占的存储空间。

  1. 查找第i-1个结点的地址,并使工作指针p指向第i-1个结点的地址;
  2. 将q指向被删除的第i个结点;
  3. 使p的指针域指向被删除结点的直接后继;
  4. 释放被删除的结点的空间;

    删除算法实现
int ListDelete(LinkList &L,int i ,ElemType &e)
{int j=0;
LNode *p,*q;
p = L;while(p->next && j <i-1)//寻找第i-1个结点,当1<=i<=n时是合法的。{               //当i=n+1时,虽然被删结点不存在,但其前驱结点存在,是尾结点p = p->next;   ++j;}
if(!(p->next) || j>i-1)//前者表明p指针已指向最后结点;后者表明要删除头结点return ERROR;
q = p->next;//用q指向将要删除的结点
p->next = q->next;//删除q指针指向的结点
e = q->data;
free(q);//释放删除结点的存储空间
return OK;
}

删除算法中的循环条件(p->next&&j<i-1)和插入算法中的循环条件(p&&(j<i−1))是有所区别的。
因为插入操作中合法的插入位置有n+1个,而删除操作中合法的删除位置只有n个,如果使用与插入操作相同的循环条件,则会出现引用空指针的情况,使删除操作失败。

更新日志

2020-4-26 首次发布
2022-8-1 正常维护

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

  1. C语言之单链表打印(遍历),查询,定位,插入,删除,链表长度

    生活记录 先聊家常,不想看废话的请直接跳到下面看代码分析. 大半个月没有更新博客了,大半个月也做了很多事情.依旧被困在英国,并且得知下个月的机票又又又被取消了:第二遍参加了某大公司的机试以及再次的失败 ...

  2. C语言数据结构单链表链表

    数据结构–单链表 学习了顺序表,我们发现顺序表在向里面存放数据的时候很麻烦,比如我们要使用头插法存放一个数据到顺序表的时候,我们要将整个表都向后挪一位,这个操作就让人很难受.那么有没有一种结构可以让我 ...

  3. C语言-数据结构-单链表的初始化,插入和输出

    [问题描述] 设有头结点单链表,实现单链表的初始化.插入和输出算法. [输入形式] 第一行输入一个N(N大于等于1,小于1000),一个M(N大于等于1,小于1000): 第二行输入N个整数,以空格作 ...

  4. c语言数据结构单链表

    #include<stdio.h> #include<stdlib.h> typedef int elemtype; typedef struct LNode {     el ...

  5. C语言:单链表的循环添加、插入操作,直到不在插入为止

    目录 老规矩,先看结果: 代码分析: 第一步:声明 第二步:输入函数 第三步:添加函数 第四步:输出函数 第五步:主函数 完整的代码: 老规矩,先看结果: 代码分析: 第一步:声明 #include& ...

  6. 数据结构--单链表(数组)

    文章目录 单链表 单链表 用数组实现的单链表可以在任意位置插入.删除.替换一个数,相比于用结构体和指针实现的动态链表而言,数组模拟链表运行的速度非常快,动态链表基本会出现超时的现象.但缺点是浪费内存 ...

  7. 线性表基本操作,单链表的建立(头插法,尾插法)、插入、删除、遍历操作的实现(c++ 数据结构 实验二)

    大学数据结构课程的实验题目,掌握线性表的链接存储结构,用c++语言描述 一.实验要求 1.分别用头插法和尾插法建立一个含有若干结点的单链表 2.对已建立的单链表进行插入.删除.遍历输出等操作 二.代码 ...

  8. 用c语言实现单链表的初始化,建表,查找,求长度,插入,删除等操作,【YTU+2430+C语言习题+链表建立+插入+删除+输(5)...

    的打印.判断链表是否为空.计算链表长度.插入节点.删除节点.删除整个链表.(2) 线性表adt顺序存储实现中的创建.查找.插入和删除等基本操作及相关算法,线性表adt链式存储实现中单链表.循环链表和双 ...

  9. C++单链表的建立和遍历

    C++单链表的建立和遍历 开发工具与关键技术:C++.VisualStudio 作者:何任贤 撰写时间:2019年05月10日 链表是以struct或class数据结构为基础的动态数据结构,它的存储方 ...

最新文章

  1. NSwagStudio for Swagger Api
  2. JPA基础(八):分析JPA与持久化实现产品对接的源代码
  3. PHP面试题:合并两个数组有几种方式,试比较它们的异同
  4. Promise:Promise.all、Promise.race、Promise.any的用法及区别
  5. linux分文件编程、静态库与动态库
  6. YbtOJ#20063-[NOIP2020模拟赛B组Day4]古老谜题【统计】
  7. oracle常用表查询,ORACLE EBS常用表及查询语句(最终整理版)
  8. aix系统下oracle之ora-00471,Oracle RAC 9.2.0.7 (AIX53,HA52)三台主机实例全down的问题
  9. 使用Mac终端设置alias常用别名,以git提交为例
  10. Exadata V2 Battery Replacement
  11. OpenOffice.org 2.0已经发布了。
  12. Java通过SSH实现文件上传下载功能
  13. 最新最全的微信小程序入门学习教程,微信小程序零基础入门到精通
  14. TFS2010升级至TFS2013完全指南(更换服务器)
  15. jupyter notebook 误删恢复
  16. CSDN 2021-2022年微博情感数据分析
  17. 假新闻遇上AI,祸兮福兮?
  18. 《创新者的基因》读书笔记
  19. Inventor冲压加强筋_inventor 加强筋教程
  20. 使用豆瓣api查找本地电影评分来决定看什么电影

热门文章

  1. 限制ip在一定时间内的请求次数
  2. 分手近半年,我终于。。。
  3. MATLAB imshow 几种用法的不同
  4. 【总结】1409- 深入浅出 npm yarn pnpm 包管理机制
  5. 系统集成项目管理工程师4知识点
  6. 斐波那契数列的递归,迭代(循环),通项公式三种实现
  7. 杀戮尖塔用java也打不开_《杀戮尖塔》创意工坊使用指南以及mod推荐
  8. 硬盘FAT文件系统原理的详细分析——转载
  9. 2022化工自动化控制仪表考试试题模拟考试平台操作
  10. 晋中计算机职业学校,山西晋中计算机学院