服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C语言数据结构与算法之链表(二)

C语言数据结构与算法之链表(二)

2022-07-09 09:34玄澈_ C/C++

在这篇文章中,我们将抛开令人头秃的指针和结构体,我们将另外使用一种数组来实现的方式,叫做模拟链表。让来跟随小编一起学习学习吧

 

引入

在上一节的学习中我们介绍了C语言如何实现链表,但是,在这一章,我们将抛开令人头秃的指针和结构体,我们将另外使用一种数组来实现的方式,叫做模拟链表。让我们一起来看看。

 

模拟链表介绍

链表中的每一个结点都只有两个部分。

我们可以使用一个数组date来储存每序列中的每一个数。那每一个数右边的数是谁,这一点该如何解决呢?在上一章的内容中我们是使用指针来解决的,这里我们只需再用一个数组right来存放序列中每一个数右边的数是谁就可以了。具体要怎么做呢?

C语言数据结构与算法之链表(二)

上面的两个数组中,第一个整型数组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中),如下

C语言数据结构与算法之链表(二)

C语言数据结构与算法之链表(二)

 

插入代码实现

	//从链表的头部开始遍历
	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语言数据结构 链表内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/forever_bryant/article/details/121880250

延伸 · 阅读

精彩推荐
  • C/C++C++设计模式迪米特法则实例

    C++设计模式迪米特法则实例

    这篇文章主要为大家详细介绍了C++设计模式迪米特法则实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    wwxy2618152021-07-15
  • C/C++VC6实现激活后台窗口最佳方法

    VC6实现激活后台窗口最佳方法

    这篇文章主要介绍了VC6实现激活后台窗口最佳方法,实例分析了VC操作后台窗口的技巧,需要的朋友可以参考下...

    1Byte5302021-02-28
  • C/C++详解C++函数类型与重载函数

    详解C++函数类型与重载函数

    这篇文章主要为大家介绍了C++函数类型与重载函数,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助...

    shxaz4512022-02-28
  • C/C++C语言中结构体struct编写的一些要点解析

    C语言中结构体struct编写的一些要点解析

    这篇文章主要介绍了C语言中结构体struct编写的一些要点解析,谈到了结构体的声明和指针指向等重要知识点,需要的朋友可以参考下...

    whuslei9852021-03-30
  • C/C++QT实现简单时钟效果

    QT实现简单时钟效果

    这篇文章主要为大家详细介绍了QT实现简单时钟效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    师子文5962021-09-08
  • C/C++基于C语言实现的贪吃蛇游戏完整实例代码

    基于C语言实现的贪吃蛇游戏完整实例代码

    这篇文章主要介绍了基于C语言实现的贪吃蛇游戏完整实例代码,对于学习游戏开发的朋友有一定的借鉴价值,需要的朋友可以参考下...

    C语言程序设计8622021-01-25
  • C/C++C++语言实现开心消消乐

    C++语言实现开心消消乐

    这篇文章主要为大家详细介绍了C++语言实现开心消消乐,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    mahaitao61710772021-10-14
  • C/C++C++语法中的函数重载和默认参数

    C++语法中的函数重载和默认参数

    这篇文章主要介绍了C++语法中的函数重载和默认参数,本文从语法角度通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值...

    C++教程网8082021-08-21