c语言定义一个动态单链表,数据结构 - 动态单链表的实行(C语言)

本文介绍了动态单链表的概念,包括数据结构和基本操作如插入、删除、头部和尾部插入。文章通过C语言详细讲解了单链表的实现,包括插入操作的核心代码、删除操作的逻辑以及头插法和尾插法的实现。此外,还提供了完整的源代码示例和清空链表的操作。
摘要由CSDN通过智能技术生成

一、什么是单链表?

单链表:使用链式存储结构的线性表。单链表中的数据是以结点来表示的,每个结点的构成:数据域(数据元素的映像) + 指针域(指示后继元素存储位置)。如果单链表不做特别说明,一般指的是动态单链表。

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

/* 线性表的单链表存储结构 */

typedef struct node

{

ElemType data;

struct node *next;

}Node, LinkList;

从这个结构定义中可以看出,结点由存放数据元素的数据域和存放后继结点地址的指针域组成。

空链表的示意图:

699e8166f8b5f455ae1f60c6fa52096d.png

带有头结点的单链表:

dec758301a7c14525b878c7c6a030607.png

不带头结点的单链表的存储结果示意图:

49c380a5dd27c07370f5e561f247b61b.png

二、单链表的基本操作

2.1 插入操作

单链表的插入操作核心代码只有两句(例如在结点 p 后面插入结点 s):

s->next = p->next; // 将p的后继结点赋值给s的后继

p->next = s; // 将s赋值给p的后继结点

解读这两句代码,也就是说让 p 的后继结点改成 s 的后继结点,再把结点 s 变成 p 的后继结点,如下图所示:

af25c0b6726635b8e75e72b47a3e7739.png

单链表第 i 个位置插入结点的算法思路:

声明一结点 front 指向链表头结点,初始化 j 从 1 开始;

当 j

若到链表末尾 front 为空,则说明第 i 个元素不存在;

否则查找成功,在系统中创建一个空结点 pTemp;

将数据元素 e 赋值给pTemp->data;

执行单链表的插入结点语旬pTemp->next = front ->next、front->next=pTemp;

返回成功。

实现代码如下:

// 插入元素操作

Status insertList(LinkList *pList, int i, const ElemType e)

{

// 判断链表是否存在

if (!pList)

{

printf("list not exist!\n");

return FALSE;

}

// 只能在位置1以及后面插入,所以i至少为1

if (i < 1)

{

printf("i is invalid!\n");

return FALSE;

}

// 找到i位置所在的前一个结点

Node *front = pList; // 这里是让front与i不同步,始终指向j对应的前一个结点

for (int j = 1; j < i; j++) // j为计数器,赋值为1,对应front指向的下一个结点,即插入位置结点

{

front = front->next;

if (front == NULL)

{

printf("dont find front!\n");

return FALSE;

}

}

// 创建一个空节点,存放要插入的新元素

Node *temp = (Node *)malloc(sizeof(Node));

if (!temp)

{

printf("malloc error!\n");

return FALSE;

}

temp->data = e;

// 插入结点

temp->next = front->next;

front->next = temp;

return TRUE;

}

实现的难点在于:如何找到要插入的 i 位置所在的前一个结点。

注意:这里是有头结点的,头结点的位置为0,所以插入位置不能为0,至少为1。

当 i=1 时,则能够不进入 while,且 front 指向头结点,后面直接在头结点后面即位置 1 插入元素 e。

当 i=2 时,则控制只进入 while 一次,且 front 指向第一个存放元素的结点,在位置 2 插入元素 e。

2.2 删除操作

单链表的删除操作核心代码只有一句(删除结点 p 后面一个结点):

p->next = p->next->next; // 将p的后继结点的后继赋值给p的后继

50bc45b5aa70ac925733b417218faeaa.png

单链表第 i 个数据之后删除结点的算法思路(删除的是 i+1 位置的结点):

声明一结点 front 指向链表头结点, 初始化 j 从 1 开始;

当 j

若到链表末尾 front 为空,则说明第 i 个元素不存在;

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值