链表的创建与使用

article/2025/9/30 13:29:47

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 目录

    文章目录

    前言

    一、链表是什么?

    二、链表的创建与基本操作

    1.链表的创建

    3.链表的头插 

     4.链表的尾插

     5.链表的销毁

    6.链表的查找

    7.链表的删除

    8.链表的排序

    总结



前言

  数组作为学习c语言以来,一直使用的一种存储方式,有着查找方便,读取数据快的特点。但是存在数组大小开辟固定,内存使用需要成块,修改插入数据操作繁琐的劣势。链表的学习可以让以上问题得到解决。


一、链表是什么?

  链表是由一个又一个结点组成的存储结构,每个结点包含一个指针域和一个数据域,数据域存储数据,指针域存储下一个结点的地址。

结点的结构

typedef struct Lnode
{ElemType data;struct Lnode* next;
}Lnode,*LinkList;

注释:

1.头结点:链表的第一个链表,数据域为空,指针指向首元结点,没有存储数据的功能。存在的意义为,操作链表的时候更方便。

2.首元结点:真实意义上的第一个结点,头结点指向的结点。

3.尾结点:链表的最后一个结点,当链表为空的时候,尾结点就是头结点。

4.前驱结点:当前结点的前面一个结点。

链表包括单链表,循环链表与双向链表,三种类型

1.单链表

尾结点指针指向空指针的链表。

2.循环链表

尾结点指针指向头结点的链表,与单链表的主要区别是,在遍历操作时,循环的判断条件有改变。

3.双向链表

在以上结点的基础上,添加一个指向前驱结点的指针,使得操作变得复杂,存储密度变低,但是时间复杂度低,属于拿空间换时间。

二、链表的创建与基本操作

以下操作皆为单链表

1.链表的创建

个人喜欢创建的链表既有头指针又有尾指针,这样的链表可以实现的操作更多,更实用。

size的设计,用来记录结点个数,实现一些操作。

typedef struct S
{int data;struct S* next;
}S, * SS;typedef struct List
{SS First;SS End;int size;
}List, * LList;

2.链表的初始化

给链表申请一块地址,即头结点,数据域赋空,指针域置空。

void Initial_List(LList str)
{str->End = str->First = (SS)malloc(sizeof(S));assert(str->First != NULL);str->size = 0;str->First->data = 0;str->First->next = NULL;
}

3.链表的头插 

在链表的头结点与首元结点之间插入。每次插入后size加一。

void Tou_cha(LList str)
{SS a;a = (SS)malloc(sizeof(S));assert(a != NULL);scanf("%d", &a->data);a->next = str->First->next;str->First->next = a;str->size++;
}

 头插的关键在于下面这两行

a->next = str->First->next;str->First->next = a;

 如图所示将新结点的指针域指向首元结点,头结点指针指向新结点,完成头插。

 4.链表的尾插

在链表的尾部插入。

void Wei_cha(LList str)
{SS a = (SS)malloc(sizeof(S));assert(a != NULL);scanf("%d", &a->data);a->next = NULL;str->End->next = a;str->End = a;str->size++;
}

关键在

		str->End->next = a;str->End = a;

就是让原先的尾结点指针域指向新结点,然后将尾结点更新为新结点

 

 5.链表的销毁

将链表销毁,只保留头结点

void Xiao_hui(LList str)
{while (str->First->next != NULL){SS A = str->First->next;str->First->next = A->next;free(A);A = NULL;str->size--;}str->End = str->First;
}

 这个思路是从首元结点依次释放掉,在释放过程中要注意下一结点的保留,确保数据不丢失。

所以我们就创建一个量临变量指针,存储首元结点,同时将首元结点的指针域赋值给头指针的指针域。之后将临时变量释放掉,就实现了一个结点的销毁也就是删除。如此循环到尾结点,就实现链表的销毁,最后将尾指针赋值为头指针。

6.链表的查找

这个比较简单,两个循环判断条件,如果是a为空指针了,那么说明直到最后一个结点,都没有找到。反之则是找到了

void Find(LList str)
{int b;scanf("请输入查找的数:%d", &b);SS a = str->First->next;while (a != NULL && a->data != b){a = a->next;}if (a == NULL){printf("没有找到\n");return;}else{printf("找到了\n");return;}
}

7.链表的删除

删除有头删,尾删两种方式。主要思路就是,将要删除的结点的前驱结点指向该结点的后面一个结点,然后将该结点释放掉。

头删:创建一个指针A,赋值为首元结点的指针域,释放掉首元结点,将头指针的指针域赋为A

void Tou_shan(LList str)
{SS a;a = str->First->next->next;free(str->First->next);str->First->next = a;str->size--;
}

尾删:创建一个指针,通过递推,得到尾结点的前驱结点。将该结点的指针域置空,释放尾结点,将该结点赋为新尾结点。

void Wei_shan(LList str)
{SS a;a = str->First;while (a->next != str->End)a = a->next;a->next = NULL;free(str->End);str->End = a;str->size--;
}

8.链表的排序

  链表的排序,操作相较以上操作要复杂一点。思路是将原链表断开。断点是首元结点与它后面一个结点中间。然后将后面一个链表的结点逐一插入到前面一个链表里面。

void Pai_xu(LList str)
{SS b = str->First->next->next;SS a = str->First->next;a->next = NULL;while (b != NULL){SS c = str->First;SS d = b;b = b->next;        while (c->next!= NULL && c->next->data < d->data)//这一步判断条件的设定特别重要。在比较的时候一定要注意拿该结点的后面一个结点去比较。不然在某些情况下,头结点会参与排序。{c = c->next;}if (c->next == NULL){a->next = d;d->next = NULL;a = d;}else{d->next = c->next;c->next = d;}}printf("排序成功\n");str->End = a;
}

总结

初识链表,可能觉得链表的使用复杂,不实用。但是随着知识的深入,你会发现链表有这许多优点,比如:插入修改数据的低空间复杂度,存储空间的灵活性...... 

最后,链表的基础操作并不是很难,但对一些基础知识要求比较高。如果很大困难的,可以先去复习一下,指针的使用、动态内存的开辟。

新人,有错误,多多指导,谢谢观看。


http://chatgpt.dhexx.cn/article/Gg1s8KN2.shtml

相关文章

链表的创建

目录 一&#xff1a;链表的定义 二&#xff1a;链表的改进 链表的实现可以为后面JAVA的类集框架服务。 链表是一种最简单的数据结构&#xff0c;其主要目的是依靠引用关系实现多个数据的保存。 一&#xff1a;链表的定义 定义一个Node类&#xff0c;保存的数据是String型&a…

C语言之创建链表

自己琢磨着思考了一下书上的单链表的创建案例&#xff0c;记录一下自己的理解 代码如下&#xff1a; #include<stdio.h> #include<stdlib.h>struct Student{char cName[20];int age;struct Student* pNext; }; /*节点数量*/ int iCount0;/*创建链表的函数 返回头…

如何创建链表?

链表&#xff1a; 链表的组成其实很简单&#xff0c;就是由很多结点组成的。 一个结点包含数据域和指针域&#xff0c;数据域用来存放数据&#xff0c;指针域负责指向其他结点&#xff0c;起到链接的作用。创建链表&#xff1a; 其实创建一个链表也很简单&#xff0c;在我看来…

用CodeBlocks写SFML程序

vs2019 写sfml程序简直杀鸡用牛刀&#xff0c;vs2019占用资源太大了。 所以我想到了用Dev-C&#xff0c;然而我不会配置&#xff0c;卑鄙的CSDN相关资料查阅需要VIP&#xff0c;然而VIP太贵了。 SFML官方教程是用Code::Blocks&#xff0c;于是去下一个。 setup安装........ …

[笔记]使用SFML来生成分形图片

前言 最近在上《优秀科普纪录片》时&#xff0c;看了一部有关 分形 的纪录片&#xff0c;在观看的过程中&#xff0c;想着自己也来生成一些分形图片&#xff0c;正好偶然了解到了SFML这个简单的图形库&#xff0c;所以天时地利人和&#xff0c;正好查一些资料来学习一下。 以…

SFML环境配置

材料&#xff1a; 1.visual studio 2017 2.SFML-2.5.1-windows-vc15-32-bit 准备阶段 1.进入SFML官网下载sfml-vs2017-32bit版本 2.将该压缩包解压在一个文件夹中 步骤&#xff1a; 1.进入vs&#xff0c;在上述文件夹中新建Empty Project&#xff0c;右键资源文件->添加-…

[SFML] 多个OpenGL上下文

代码 #include <iostream> #include <gl/glew.h> #include <SFML/Graphics.hpp> #include <windows.h>int main() {auto getInstance [](){return (HINSTANCE)GetModuleHandle(nullptr);};auto debug [](GLenum source, GLenum type, GLuint id, GL…

SFML配置问题

先去下载安装包&#xff0c;这里我就不多说了&#xff0c;我想说的是其中的报错问题&#xff0c;按照我所说的对照下去&#xff0c;一般不会出现报错现象。 ** 第一步&#xff1a; **找到项目属性&#xff0c;这里我选择所有配置和所有平台&#xff0c;你们也可以选择其他的。…

SFML+vs2019安装

SFMLvs2019安装 1.创建一个c空项目 2.打开属性管理器 3.添加新项目属性表 在64下单击鼠标右键 添加成功后回到属性表64找到刚刚添加的属性表单击鼠标右键–>属性单击 找到SFML安装目录的include&#xff0c;复制路径粘贴到C/C->常规–>附加包含目录 找到SFM…

SFML初学-俄罗斯方块实现

偶然看到大神使用 SFML 制作游戏&#xff0c;简单学习了一下这个库的使用并且仿照YouTube上大神的思路做了一个俄罗斯方块&#xff0c;目前只实现了出现方块、消除方块的功能&#xff0c;随着慢慢学习一点点继续修改吧&#xff1b; 资源&#xff1a; 源码&#xff1a; /*******…

使用c++SFML制作月圆之夜总集篇

写在开头 重新以时间线的形式整理一下去年使用c的SFML库制作月圆之夜&#xff08;游戏程序设计大作业&#xff09;的开发过程&#xff0c;括号里面是新的补充以及对一年前自己的吐槽 因为是在大二转专业后做首次接触游戏开发后才做的&#xff0c;当时c学习得并不好&#xff0…

SFML loadFromFile()出错:failed to load image

解决方法&#xff1a;确保你的依赖项和你的运行库一致。 如果你的附加依赖项&#xff08;即动态链接库的.lib文件&#xff09;是debug版本&#xff0c;即以-d结尾。那么你的运行库也必须为debug版&#xff0c;即MDd。&#xff08;如下&#xff09; 附加依赖项的位置&#xff1…

用c++和SFML实现简易的界面版贪吃蛇

运行截图 等待开始界面 运行过程 失败界面截图 SFML配置 csdn上面已经有很多SFML配置的blog&#xff0c;随便就能搜到。正常配置好SFML后&#xff0c;还需要将字体ttf文件放在源代码同一目录和exe同一目录中&#xff0c;不然无法显示字符 代码部分 下面贴上各个部分的代码 …

VS2017、VS2019配置SFML

一、sfml官网下载32位的版本 一样的设置&#xff0c;64位的版本我没有成功&#xff0c;用不了。 https://www.sfml-dev.org/ bin目录下的文件拷贝到System32和SysWOW64里面。 二、 鼠标右击红色处&#xff0c;弹出菜单&#xff0c;点最后那个属性。 如果不是win32&#xff0c;…

VS2019配置SFML

VS2019配置SFML 1.下载安装SFML SDK 网址&#xff1a;https://www.sfml-dev.org/download.php 解压并放在文件夹里&#xff0c;记住这个路径。 在我的电脑中这个路径是F:\CProjects\_library\SFML-2.5.1 2.VS新建一个C控制台项目 我命名为SfmlTest&#xff0c;并放在常用的项…

sfml-tutorials 官方教程 windows篇

系列文章 SFML-windows 篇 SFML-Events explained 篇 SFML-Keyboard, mouse and joystick 篇 SFML-Using OpenGL in a SFML window 篇 SFML-Drawing 2D stuff 篇 SFML-Shapes 篇 SFML-Sprites and textures 篇 文章目录 系列文章打开一个windows执行windows绘制windows控制帧速…

SFML基础

原文地址&#xff1a;https://www.cnblogs.com/karl07/p/10285692.html (1) 窗口和交互 创建一个新窗口&#xff1a; sf::RenderWindow window(sf::VideoMode(500,500),"new window"); 但是光创建一个窗口并不能显示 还要加一个循环 while (window.isOpen()){sf:…

引擎开发四: SFML库及使用

SFML 是多媒体库&#xff0c;它为PC的各个组件提供简单的界面&#xff0c;用来简化游戏和多媒体应用程序的开发。 主要由五个模块组成&#xff0c;分别是&#xff1a;系统&#xff0c;窗口&#xff0c;图形&#xff0c;音频和网络。 SFML 是跨平台的&#xff0c;通过 SFML&…

【C++】开源:多媒体SFML库使用入门

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍SFML库使用。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习知识&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次更新不迷路&#…

使用SFML框架打造属于自己的俄罗斯方块

目录 一、效果展示 二、游戏说明 三、开发环境 四、代码展示 五、代码详解 1.游戏区域表示 2.方块表示 3.方块旋转 4.消行处理 六、个性化定制 七、结语 一、效果展示 二、游戏说明 相信大家都玩过俄罗斯方块&#xff0c;五种按键就能带来极高的可玩性。如果想要开发…