在这篇文章中,我们将抛开令人头秃的指针和结构体,我们将另外使用一种数组来实现的方式,叫做模拟链表。让来跟随小编一起学习学习吧
引入
在上一节的学习中我们介绍了C语言如何实现链表,但是,在这一章,我们将抛开令人头秃的指针和结构体,我们将另外使用一种数组来实现的方式,叫做模拟链表。让我们一起来看看。
模拟链表介绍
链表中的每一个结点都只有两个部分。
我们可以使用一个数组date来储存每序列中的每一个数。那每一个数右边的数是谁,这一点该如何解决呢?在上一章的内容中我们是使用指针来解决的,这里我们只需再用一个数组right来存放序列中每一个数右边的数是谁就可以了。具体要怎么做呢?
上面的两个数组中,第一个整型数组date是用来存放序列中的具体数字的,另外一个整型数组right是用来存放当前序列中每一个元素右边的元素在数组date中位置的。
例如right【1】的值为2,就表示当前序列中1号元素右边的元素存放在date【2】 中;如果是0,例如right【9】的值为0,就表示当前序列中9号元素的右边没有元素。
现在需要在8面前插入一个6,只需将6直接存在数组date的末尾即date【10】 = 6.
接下来只需要将right【3】改为10,表明新序列中3号元素右边的元素存放在date【10】中。再将right【10】的值改为4,表示新序列中10号元素右边的元素存放在date【4】中。
这样我们通过right数组就可以从头到尾遍历整个序列了(序列的每个元素的值存放在对应的数组date中),如下
插入代码实现
//从链表的头部开始遍历
t = 1;
while(t != 0)
{
//如果当前结点下一个结点的值大于待插入数,将数插到中间
if(date[right[t]] > date[len])
{
right[len] = right[t]; //新插入的数的下一个结点标号等于当前结点的下一个标号
right[t] = len; //当前结点的下一个结点编号就是新插入数的编号
break; //插入完成跳出循环
}
t = right[t];
}
代码实现
#include <stdio.h>
int main()
{
int date[101],right[101];
int i,n,t,len;
//读入已有的数
scanf("%d",&n);
for(i = 1;i <= n;i++)
scanf("%d",&date[i]);
len = n;
//初始化数组right
for(i = 1;i <= n;i++)
{
if(i != n)
right[i] = i + 1;
else
right[i] = 0;
}
//直接在数组date的末尾加一个数
len++;
scanf("%d",&date[len]);
//从链表的头部开始遍历
t = 1;
while(t != 0)
{
//如果当前结点下一个结点的值大于待插入数,将数插到中间
if(date[right[t]] > date[len])
{
right[len] = right[t]; //新插入的数的下一个结点标号等于当前结点的下一个标号
right[t] = len; //当前结点的下一个结点编号就是新插入数的编号
break; //插入完成跳出循环
}
t = right[t];
}
//输出链表中的所有数
t = 1;
while(t != 0)
{
printf("%d",date[t]);
t = right[t];
}
return 0;
}
到此这篇关于C语言数据结构与算法之链表(二)的文章就介绍到这了,更多相关C语言数据结构 链表内容请搜索编程学习网以前的文章希望大家以后多多支持编程学习网!
本文标题为:C语言数据结构与算法之链表(二)
基础教程推荐
- C++详细实现完整图书管理功能 2023-04-04
- C++中的atoi 函数简介 2023-01-05
- C语言基础全局变量与局部变量教程详解 2022-12-31
- 如何C++使用模板特化功能 2023-03-05
- 详解c# Emit技术 2023-03-25
- C语言 structural body结构体详解用法 2022-12-06
- 一文带你了解C++中的字符替换方法 2023-07-20
- C++使用easyX库实现三星环绕效果流程详解 2023-06-26
- C利用语言实现数据结构之队列 2022-11-22
- C/C++编程中const的使用详解 2023-03-26