返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言数据结构与算法之链表(一)
  • 972
分享到

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

2024-04-02 19:04:59 972人浏览 泡泡鱼
摘要

目录引言链表的相关思考链表结点结构建立链表实现插入操作完整代码引言 在存储一大波数的时候,我们通常使用的是数组,但是数组有时候又会显得不够灵活,比如下面这个例子: 有一串已经排序好的

引言

在存储一大波数的时候,我们通常使用的是数组,但是数组有时候又会显得不够灵活,比如下面这个例子:

有一串已经排序好的数 2,3,5,8,9 ,10

如果我们想要往数组中插入6 这个元素,需要把 8 以后的元素全部往后挪一位

这样操作显然很耗费时间,如果使用链表的话则会快很多。那么什么是链表呢?请看下图:

此时如果需要在8前面加入一个6,那么只需要向下图一样更改一下就可以了,而不用向像最开始那样把每个数向后挪。

链表的相关思考

为了实现链表这样的数据结构,我们需要使用指针和malloc这样的函数。

注意 : malloc 函数的返回值是 void * 类型,我们需要对其进行强制类型转换 

使用malloc时需要调用头文件 <stdlib.h>

为什么我们要用这么复杂的办法来储存类型呢?

因为按照之前的方法,我们必须预先准确地知道所需变量的个数,也就是说我们必须我们必须定义出所有的变量。假如说你现在定义了100个变量,而实际上则需要101个变量,那么就不得不对这个程序进行修改。

而有了malloc函数,我们可以在程序运行的过程中根据实际情况来申请空间。

链表结点结构

每一个结点都由两个部分组成。左边的部分用来存放具体的值,那么用一个整型变量就可以;右边的部分则需要储存下一个点的地址,则可以用指针来实现(也称为后继指针)。

这里我们定义一个结构体类型来存储这个结点:


struct node
{
	int date;
	struct node* next;
};

因为下一个结点的类型也是 struct node ,所以我们指针的类型也必须是 struct node * 类型。

建立链表

首先,我们需要一个头指针 head 指向链表的最开始。当链表还没有建立的时候头指针head为空(也可以理解指向空结点)。


struct node* head;
head = NULL;  //头指针初始为空

现在,我们来创立第一个结点,并用临时指针p指向这个结点


struct node* p;
//动态申请一块空间,用来存放一个结点,并用临时指针p指向这个结点
p = (struct node*)malloc(sizeof(struct node));

接下来分别设置新建的结点的左半部分和右半部分


scanf("%d", &a);
p->date = a;	 //将数据存储到当前结点的date域中
p->next = NULL;  //设置当前结点的后继指针为空,也就是当前结点的下一个结点为空

下面来设置头指针并设置新创结点的 *next 指向空 。头指针的作用是方便以后从头遍历整个链表


if (head == NULL)
	head = p;  //如果这是第一个创建的结点,则将头指针指向这个结点
else
	q->next = p;	//如果不是第一个创建的结点,则将上一个结点的后继指针指向当前结点

如果是第一个创立的结点,则将头指针指向这个结点 

如果不是第一个创建的结点,则将上一个结点的后继节点指向当前结点。

最后要将指针q也指向当前结点,因为待会临时指针p将会指向新创建的结点。


q = p;  //指针q也要指向当前结点

#include <stdio.h>
#include <stdlib.h>
 
//这里创建一个结构体用来表示链表的结点类型
struct node
{
	int date;
	struct node* next;
};
 
int main()
{
	struct node* head, * p, * q = NULL, * t;
	int i, n, a;
	scanf("%d", &n);
	head = NULL;  //头指针初始化为空
	for (i = 1; i <= n; i++)
	{
		scanf("%d", &a);
		//动态申请一块空间,用来存放一个结点,并用临时指针p指向这个结点
		p = (struct node*)malloc(sizeof(struct node));
		p->date = a;
		p->next = NULL; //设置当前结点的后继指针为空,也就是下一个结点为空
		if (head == NULL)
			head = p;	//如果这是第一个创建的结点,则将头指针指向这个点
		else
			q->next = p;//如果不是第一个创建的结点,则将上一个结点的后继节点指向当前结点
 
		q = p;  //指针q也指向当前结点
	}
 
	//输出链表中的所有数
	t = head;
	while (t != NULL)
	{
		printf("%d  ", t->date);
		t = t->next;  //继续下一个结点
	}
 
}

效果图

实现插入操作

首先用一个临时指针t从链表的头部开始遍历


 t = head; //从链表的头部开始遍历

等到指针t的下一个结点的值比6大的时候,将6插到中间。

即 t -> next -> date 大于 6 的时候进行插入

代码实现


	scanf("%d", &a);  //读入待插入的数
	t = head;		  //从链表的头部开始遍历
	while (t != NULL)
	{
		if (t->next->date > a || t->next->next == NULL)
		{
			//如果当前结点是最后一个结点或者下一个结点的值大于待插入的值的时候插入
			p = (struct node*)malloc(sizeof(struct node)); //申请一块空间,来存放新增结点
			p->date = a;
			p->next = t->next;//新增结点的后继指针指向当前结点的后继指针所指向的结点
			t->next = p;	  //当前结点的后继指针指向新增结点
			break;			  //插入完毕退出循环
			 
		}
		t = t->next;   //继续下一个结点
	}

完整代码

效果图:


#include <stdio.h>
#include <stdlib.h>
 
//这里创建一个结构体用来表示链表的结点类型
struct node
{
	int date;
	struct node* next;
};
 
int main()
{
	struct node* head, * p, * q = NULL, * t;
	int i, n, a;
	scanf("%d", &n);
	head = NULL;  //头指针初始化为空
	for (i = 1; i <= n; i++)
	{
		scanf("%d", &a);
		//动态申请一块空间,用来存放一个结点,并用临时指针p指向这个结点
		p = (struct node*)malloc(sizeof(struct node));
		p->date = a;
		p->next = NULL; //设置当前结点的后继指针为空,也就是下一个结点为空
		if (head == NULL)
			head = p;	//如果这是第一个创建的结点,则将头指针指向这个点
		else
			q->next = p;//如果不是第一个创建的结点,则将上一个结点的后继节点指向当前结点
 
		q = p;  //指针q也指向当前结点
	}
 
	scanf("%d", &a);  //读入待插入的数
	t = head;		  //从链表的头部开始遍历
	while (t != NULL)
	{
		if (t->next->date > a || t->next->next == NULL)
		{
			//如果当前结点是最后一个结点或者下一个结点的值大于待插入的值的时候插入
			p = (struct node*)malloc(sizeof(struct node)); //申请一块空间,来存放新增结点
			p->date = a;
			p->next = t->next;//新增结点的后继指针指向当前结点的后继指针所指向的结点
			t->next = p;	  //当前结点的后继指针指向新增结点
			break;			  //插入完毕退出循环
			 
		}
		t = t->next;   //继续下一个结点
	}
 
 
 
 
	//输出链表中的所有数
	t = head;
	while (t != NULL)
	{
		printf("%d  ", t->date);
		t = t->next;  //继续下一个结点
	}
 
}

以上就是C语言数据结构与算法之链表(一)的详细内容,更多关于C语言数据结构 链表的资料请关注编程网其它相关文章!

--结束END--

本文标题: C语言数据结构与算法之链表(一)

本文链接: https://lsjlt.com/news/159778.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C语言数据结构与算法之链表(一)
    目录引言链表的相关思考链表结点结构建立链表实现插入操作完整代码引言 在存储一大波数的时候,我们通常使用的是数组,但是数组有时候又会显得不够灵活,比如下面这个例子: 有一串已经排序好的...
    99+
    2024-04-02
  • C语言数据结构与算法之单链表
    目录基本概念读取数据元素获取第i个结点的数据元素插入数据元素 初始化链表打印链表顺序表查空顺序表的删除 删除第i个结点及其数据元素情况1:当删除的是第一个元素情况2:除第一个结点外完...
    99+
    2024-04-02
  • C语言数据结构与算法之链表(二)
    目录引入模拟链表介绍插入代码实现代码实现  引入 在上一节的学习中我们介绍了C语言如何实现链表,但是,在这一章,我们将抛开令人头秃的指针和结构体,我们将另外使用一种数组来实现的方式,...
    99+
    2024-04-02
  • C语言数据结构与算法之排序总结(一)
    目录一、前言二、基本概念1.排序2.排序方法的稳定性3.内部和外部排序三、插入类排序1.直接插入排序2.折半插入排序3.希尔排序四、交换类排序1.冒泡排序2.快速排序五、总结比较一、...
    99+
    2024-04-02
  • C语言数据结构与算法之图的遍历(一)
    目录引入 深度优先搜索代码实现 完整代码  引入  在数据结构中常见的有深度优先搜索和广度优先搜索。为什么叫深度和广度呢?其实是针对图的遍历而言的,请看下面这个图: 图是由一些小圆...
    99+
    2024-04-02
  • C语言数据结构之顺序表和单链表
    一、顺序表的创建、删除和插入 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> struct sqlist { ...
    99+
    2024-04-02
  • C语言数据结构与算法之排序总结(二)
    目录一、前言二、选择类排序1.简单选择排序2.树形选择排序3.堆选择排序三、归并排序四、分配类排序1.多关键字排序2.链式基数排序五、总结归纳一、前言 之前的排序总结(一)对插入类和...
    99+
    2024-04-02
  • C语言数据结构之单链表的实现
    目录一.为什么使用链表二.链表的概念三.链表的实现3.1 创建链表前须知3.2 定义结构体3.3 申请一个节点3.4 链表的头插3.5 链表的尾插3.6 链表的尾删3.7 链表的头删...
    99+
    2024-04-02
  • Python数据结构与算法之链表,无序链表详解
    目录我们首先来构造节点。节点(Node)的类构建完毕后,接下来我们开始构建整个链表(LinkList)的类。那么我们还需要一个方法来判断链表头的指向。接下来我们构建链表节点的添加方法...
    99+
    2024-04-02
  • C语言数据结构之线性表的链式存储结构
    1.什么是线性表的链式存储结构 —链表 存储结点:包括元素本身的信息,还有元素之间的关系逻辑的信息 这个结点有:数据域和指针域 一个指针域:指向后继结点, 单链表 二个指针域: 指向...
    99+
    2024-04-02
  • C语言数据结构之双链表&循环链表&静态链表详解
    目录单链表 VS 双链表双链表双链表的初始化(带头结点)双链表的插入双链表的删除双链表的遍历循环单链表循环双链表循环双链表的初始化循环双链表的插入循环双链表的删除静态链表什么是静态链...
    99+
    2024-04-02
  • C语言数据结构之单链表怎么实现
    本文小编为大家详细介绍“C语言数据结构之单链表怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“C语言数据结构之单链表怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一.为什么使用链表在学习链表以前,...
    99+
    2023-07-02
  • C语言数据结构之单链表存储详解
    目录1、定义一个链表结点2、初始化单链表3、输出链表数据4、完整代码如果说,顺序表的所占用的内存空间是连续的,那么链表则是随机分配的不连续的,那么为了使随机分散的内存空间串联在一起形...
    99+
    2024-04-02
  • C语言数据结构之单链表操作详解
    目录1、插入操作2、删除操作3、查找操作4、修改操作5、完整代码1、插入操作 (1)创建一个新的要插入的结点 (2)将新结点的 next 指针指向插入位置后的结点 (3)将插入位置前...
    99+
    2024-04-02
  • C语言数据结构之复杂链表的拷贝
    题目: 给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 ...
    99+
    2024-04-02
  • C语言数据结构与算法之图的遍历(二)
    目录前言 广度优先搜索过程主要思想 代码实现  前言  在上一章的内容中我们使用了深度优先搜索来进行遍历,这一章我们选择使用广度优先搜索来完成这个图的遍历 --> 结果如下:...
    99+
    2024-04-02
  • C语言数据结构与算法之字符串详解
    目录串的定义串的比较 串的抽象数据类型串的初始化相关定义初始化定长类初始化串的堆式顺序存储结构(Heap)初始化堆字符串 赋值操作比较两个堆字符串的大小 串的定义...
    99+
    2024-04-02
  • C语言结构体使用之链表
    目录一、结构体的概念二、结构体的用法三、结构体数组和指针四、结构体指针五、包含结构体的结构体六、链表七、静态链表八、动态链表一、结构体的概念 比如说学生的信息,包含了学生名称、学号、...
    99+
    2024-04-02
  • C++数据结构之单链表
    目录单链表结构的定义单链表打印动态申请一个结点单链表尾插单链表尾删单链表头插单链表头删求单链表长度单链表查找单链表在pos位置插入单链表在pos后面位置插入单链表删除pos位置单链表...
    99+
    2024-04-02
  • Java数据结构与算法学习之循环链表
    目录存储结构示意图初始化循环链表 循环链表的插入首位置代码实现其他位置代码实现(总)循环链表的删除1.操作的为第一个元素2.操作元素不为第一个元素代码实现(总)循环链表的常见操作  ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作