iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言实现单链表的基本操作分享
  • 884
分享到

C语言实现单链表的基本操作分享

C语言单链表基本操作C语言单链表 2022-11-13 18:11:21 884人浏览 八月长安
摘要

目录导语单链表单链表的特点定义初始化操作头插法尾插法删除第i个元素在第i个位置插入导语 无论是顺序存储结构还是链式存储结构,在内存中进行存放元素的时候,不仅需要存放该元素的相关信息,

导语

无论是顺序存储结构还是链式存储结构,在内存中进行存放元素的时候,不仅需要存放该元素的相关信息,还需要存放该元素和其他元素之间的关系,而我们之前所学的顺序表“与生俱来”的物理结构自然地能够表达出元素和元素之间的关系,不需要额外的信息去表达元素和元素之间的关系,而对于链式存储这种非顺序存储的结构,需要额外附加指针去表示这种关系。

单链表

每个结点除了存放数据元素外,还要存储指向下一个节点的指针。

单链表的特点

优点:不要求大片连续空间,改变容量方便

缺点:不可随机存取,要耗费一定空间存放指针

定义

typedef struct Lnode {
	int data;
	struct LNode* next;//指针指向下一个节点,指针的类型为节点类型;
}*LinkNode;//声明*LinkNode为结构体指针类型

除了上述这种方法外,我们还可以先先声明LinkNode为结构体类型,在使用该类型的时候,将对应的变量定义为指针即可。

单链表分为带头结点和不带头结点,我们一般主要学习带头结点的。

初始化操作

在所有的操作之前,我们首先需要建立一个空的单链表,那么首先需要做的就是分配头结点。

void InistLinkNode(LinkNode& L) {
	L = (LNode*)malloc(sizeof(LNode));//分配头结点
	L->next = NULL;
}

头插法

“头插法”顾名思义就是将元素插入到头结点之后,插入一次好像和我们通常所讲的插入没什么区别,但多次这样插到头结点之后,也就是“第一个真正的节点”,那么是不是会产生一种现象,它最终的存储数据和我们所插入时的顺序是相反的。

void InsertLinkNode(LinkNode& L) {
	LNode* s;
	int x,Length;
	printf("请输入你要插入的元素个数:");
	scanf("%d", &Length);
	printf("请输入你要插入的元素:\n");
	for (int j = 0; j < Length; j++) {
		s = (LNode*)malloc(sizeof(LNode));//每插入一个元素之前,都需要给它分配节点空间
		scanf("%d", &x);
		s->data = x;
		s->next = L->next;
		L->next = s;
	}

} 

通过程序验证以下:

尾插法

“尾插法”顾名思义就是将元素插入到表尾,也就是我们普通的插入,那么怎么要找到表尾的位置呢?在顺序表中,我们完全可以利用它顺序存储结构的天然特性,通过下标即可以找到,但是单链表是没有办法的,我们只有两种方式,要么循环遍历,要么尝试在表尾的地方做个标记。

那么那种方法是好的呢?

答案是第二种!循环遍历的方式,如果只插入一个元素看似没什么问题,但如果多次的重复遍历循环无疑增加了时间复杂度,这显然不是好的方法。

第二个方法就不存在时间复杂度的问题,只需要在表尾位置做个标记,使它永远指向表尾即可。

void TailInsertLinkNode(LinkNode& L) {
	LNode* s,*r;
	int x,Length;
	r = L;//r为表尾指针
	printf("请输入你要插入的元素个数:");
	scanf("%d", &Length);
	printf("请输入你要插入的元素:\n");
	for (int j = 0; j < Length; j++) {
		s = (LNode*)malloc(sizeof(LNode));
		scanf("%d", &x);
		s->data = x;
		r->next = s;
		r = s;//s为当前的表尾指针,将他的值赋值给r----使r永远指向表尾
	}
	printf("\n");
	r->next = NULL;
}

删除第i个元素

既然要删除某个元素,那么首先我们需要保证这个元素是非NULL,其次,我们还需要保证它前面的那个节点也是非NULL,为什么呢?因为如果将该元素从链表中删除后,只有前面节点非NULL的情况下,才可以实现后续元素和前面子表的连接。

void DeleteLinkNode(LinkNode& L) {
	int x, j = 0,e;
	printf("请输入你要删除的元素位序:\n");
	scanf("%d", &x);
	LNode*p = L;
	while (p != NULL && j < x - 1) {//寻找要删除元素前的元素
		p = p->next;
		j++;
	}
	if (p == NULL)
	{
		printf("不存在我们要删除的元素!");
	}
	if (p->next == NULL)//判断该要删除的节点是否为NULL
	{
		printf("不存在我们要删除的元素!");
	}
	LNode* q = p->next;//q为我们要删除的节点
	e = q->data;
	p->next = q->next;
	free(q);//需要及时的将删除了的元素空间进行释放
}

其他的基本操作都是很常规化的,这里就不单独的进行解释了,需要注意的点,我会在文章结尾部分的完整代码的注释中展出。

在第i个位置插入

void IncreaseLinkNode(LinkNode& L) {
	printf("请输入你要插入的元素和位序:(元素和位序之间用逗号隔开)\n");
	int x, j = 0, e;
	scanf("%d,%d",&e, &x);
	LNode* s = L, * r= (LNode*)malloc(sizeof(LNode));
	while (j < x-1  && s != NULL) {
		j++;
		s = s->next;
	}
	r->data = e;
	r->next = s->next;
	s->next = r;
}

如下所示的代码顺序不能发生改变,否则会出现无法和后面的节点;

r->next = s->next;
s->next = r;

完整代码如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode {
	int data;
	struct LNode* next;
}*LinkNode;
//初始化
void InistLinkNode(LinkNode& L) {
	L = (LNode*)malloc(sizeof(LNode));//分配头结点
	L->next = NULL;
}
//头插法
void InsertLinkNode(LinkNode& L) {
	LNode* s;
	int x,Length;
	printf("请输入你要插入的元素个数:");
	scanf("%d", &Length);
	printf("请输入你要插入的元素:\n");
	for (int j = 0; j < Length; j++) {
		s = (LNode*)malloc(sizeof(LNode));
		scanf("%d", &x);
		s->data = x;
		s->next = L->next;
		L->next = s;
	}
} 
//尾插法
void TailInsertLinkNode(LinkNode& L) {
	LNode* s,*r;
	int x,Length;
	r = L;
	printf("请输入你要插入的元素个数:");
	scanf("%d", &Length);
	printf("请输入你要插入的元素:\n");
	for (int j = 0; j < Length; j++) {
		s = (LNode*)malloc(sizeof(LNode));
		scanf("%d", &x);
		s->data = x;
		r->next = s;
		r = s;
	}
	printf("\n");
	r->next = NULL;
}
//输出单链表
void PrintLinkNode(LinkNode& L)
{
	LNode* s=L->next;
	printf("单链表元素如下:\n");
	while (s != NULL) {
		printf("%d", s->data);
		s =s->next;
	}
	printf("\n");
}
//求线性表长度
void lengthLinkNode(LinkNode& L)
{
	LNode* s = L->next;
	int n=0;
	while (s != NULL) {
		n++;
		s = s->next;
	}
	printf("单链表长度为:%d",n);
	printf("\n");
}
//取第i个元素
void GetElemLinkNode(LinkNode& L) {
	printf("请输入你要查找的元素位序:\n");
	int i, j = 0;
	LNode* s=L;
	scanf("%d", &i);
	while (j < i && s != NULL) {
		j++;
		s = s->next;
	}
	if (s == NULL) {
		printf("不存在我们要查找的元素!");
	}
	else {
		printf("元素位序为%d的元素是%d",i, s->data);
	}
	printf("\n");
}
//删除第i个元素
void DeleteLinkNode(LinkNode& L) {
	int x, j = 0,e;
	printf("请输入你要删除的元素位序:\n");
	scanf("%d", &x);
	LNode*p = L;
	while (p != NULL && j < x - 1) {
		p = p->next;
		j++;
	}
	if (p == NULL)
	{
		printf("不存在我们要删除的元素!");
	}
	if (p->next == NULL)
	{
		printf("不存在我们要删除的元素!");
	}
	LNode* q = p->next;
	e = q->data;
	p->next = q->next;
	free(q);
}
//在第i个位置插入
void IncreaseLinkNode(LinkNode& L) {
	printf("请输入你要插入的元素和位序:(元素和位序之间用逗号隔开)\n");
	int x, j = 0, e;
	scanf("%d,%d",&e, &x);
	LNode* s = L, * r= (LNode*)malloc(sizeof(LNode));
	while (j < x-1  && s != NULL) {
		j++;
		s = s->next;
	}
	r->data = e;
	r->next = s->next;
	s->next = r;
}
//查找位序
void SearchLinkNode(LinkNode &L) {
	int x,j=1;
	LNode* p=L->next;
	printf("请输入你要查找的元素:\n");
	scanf("%d", &x);
	while (p != NULL && p->data != x) {
		p = p->next;
		j++;
	}
	if (p == NULL) {
		printf("您要查找的元素不存在!");
	}
	else {
		printf("你要查找的元素%d的位序为%d", x, j);
	}
}
int main() {
	LinkNode L;
	InistLinkNode(L);
	
	TailInsertLinkNode(L);
	PrintLinkNode(L);
	lengthLinkNode(L);
	GetElemLinkNode(L);
	IncreaseLinkNode(L);
	PrintLinkNode(L);
	DeleteLinkNode(L);
	PrintLinkNode( L);
	SearchLinkNode(L);
}

输出:

到此这篇关于C语言实现单链表的基本操作分享的文章就介绍到这了,更多相关C语言单链表内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C语言实现单链表的基本操作分享

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C语言实现单链表的基本操作分享
    目录导语单链表单链表的特点定义初始化操作头插法尾插法删除第i个元素在第i个位置插入导语 无论是顺序存储结构还是链式存储结构,在内存中进行存放元素的时候,不仅需要存放该元素的相关信息,...
    99+
    2022-11-13
    C语言单链表基本操作 C语言单链表
  • ​​​​​​​C语言实现单链表基本操作方法
    目录存储结构基本功能头插法创建单链表尾插法创建单链表获取指定位置的元素在指定位置插入元素删除指定位置的元素获取单链表的长度合并两个非递减的单链表晴链表遍历打印单链表附上完整代码存储结...
    99+
    2022-11-13
  • C语言中双链表的基本操作
    目录带头结点的双向循环链表基本操作创建销毁打印尾插法尾删头插头删查找元素位置任意位置插入任意位置删除完整代码及测试总结带头结点的双向循环链表 链表结构如下: 每个节点都有一个数据域和...
    99+
    2023-02-05
    C语言双链表 双链表的基本操作 C语言双链表操作
  • C语言实现链队列基本操作
    队列的链式存储结构实现,相比于循环队列实现要复杂一些,但是没有队满的限制。 头文件声明 #include <stdio.h> #include <stdlib....
    99+
    2022-11-12
  • C语言如何实现单链表操作
    本篇内容介绍了“C语言如何实现单链表操作”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1 链表的概念及结构概念:链表是一种物理存储结构上非连...
    99+
    2023-06-29
  • C语言实现单链表的基本功能详解
    1.首先简单了解一下链表的概念: 要注意的是链表是一个结构体实现的一种线性表,它只能从前往后,不可以从后往前(因为next只保存下一个节点的地址).在实现单链表的操作时,需要用指针...
    99+
    2022-11-12
  • C语言怎么实现单链表的基本功能
    本篇内容主要讲解“C语言怎么实现单链表的基本功能”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言怎么实现单链表的基本功能”吧!首先简单了解一下链表的概念:要注意的是链表是一个结构体实现的一种...
    99+
    2023-06-21
  • C语言中单链表(不带头结点)基本操作的实现详解
    目录一、单链表的概念二、单链表的基本操作1.创建单个结点2.创建具有n个结点的链表3.打印单链表4.尾插5.尾删6.头插7.头删8.查找某个结点9.在某个结点后面插入10.在某个结点...
    99+
    2022-11-16
    C语言单链表操作 C语言单链表
  • C语言中单链表的基本操作指南(增删改查)
    目录1.链表概述2.链表的基本使用2.0 准备工作2.1 创建节点(结构体)2.2 全局定义链表头尾指针 方便调用2.3 创建链表,实现在链表中增加一个数据(尾添加)————增2.4...
    99+
    2022-11-12
  • C语言 超详细模拟实现单链表的基本操作建议收藏
    目录1 链表的概念及结构2 链表的分类3 链表的实现无头+单向+非循环链表增删查改实现3.1 链表的定义3.2 链表数据的打印3.3 链表的尾插3.4 链表空间的动态申请3.5 链表...
    99+
    2022-11-13
  • C语言实现线性表的基本操作详解
    目录前言一、实训名称二、实训目的三、实训要求四、实现效果五、顺序存储代码实现六、链式存储代码实现前言 这里使用的工具是DEV C++ 可以借鉴一下 一、实训名称 线性表的基本操作 二...
    99+
    2022-11-12
  • C语言中单链表的基本操作(创建、销毁、增删查改等)
    目录链表分类单链表的介绍单链表的基本操作创建打印尾插头插尾删头删查找任意位置插入任意位置删除销毁完整代码总结链表分类 链表主要有下面三种分类方法: 单向或者双向带头或者不带头循环或者...
    99+
    2023-02-05
    C语言单链表 单链表的创建 单链表的销毁 单链表的增删查改
  • Go 语言结构体链表的基本操作
    目录1. 什么是链表2. 单项链表的基本操作3. 使用 struct 定义单链表4. 尾部添加节点方法一5. 头部插入节点方法一6. 指定节点后添加新节点7. 删除节点1. 什么是链...
    99+
    2022-11-13
  • C语言基于单链表实现通讯录功能
    本文实例为大家分享了C语言基于单链表实现通讯录功能的具体代码,供大家参考,具体内容如下 #include<stdio.h> #include<stdlib.h&...
    99+
    2022-11-12
  • C语言中如何实现单向链表的增删查改操作
    这篇文章主要介绍了C语言中如何实现单向链表的增删查改操作,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。前言链表是线性表的链式存储结构,它可以以O(1)的时间复杂度进行插入或者...
    99+
    2023-06-25
  • C语言实现顺序表的基本操作的示例详解
    目录一、认识顺序表1.线性表2.顺序表的概念及结构二、顺序表的基本操作(接口实现)1.初始化顺序表2.打印顺序表3.尾插4.尾删5.扩容6.头插7.头删8.任意位置插入9.任意位置删...
    99+
    2022-11-13
    C语言顺序表基本操作 C语言顺序表操作 C语言顺序表
  • C语言数据结构之单链表与双链表的增删改查操作实现
    目录前言单链表的增删改查定义结构体以及初始化增加结点删除结点查找修改结点移除结点最终效果双链表的基本操作初始化建表遍历双链表指定位置插入结点指定位置删除结点查找结点位置最终效果结语前...
    99+
    2022-11-13
  • C语言实现串的顺序存储表示与基本操作
    本文实例为大家分享了C语言实现串的顺序存储表示与基本操作代码,供大家参考,具体内容如下 1、串的三种存储表示 串,即:字符串。要注意的是,C语言中是没有字符串数据类型的,而将其作为一...
    99+
    2022-11-12
  • C语言实现循环队列基本操作
    循环队列依靠取模运算,实现队列中数据元素的逻辑成环操作。其相比队列的顺序存储实现,可以避免“假溢出”的问题。 头文件声明 #include <stdio.h> #in...
    99+
    2022-11-12
  • C语言数据结构之链队列的基本操作
    目录1.队列的定义2.队列的表示和实现(1)初始化操作(2)销毁队列(3)入队操作(4)出队操作附录完整代码:总结1.队列的定义 队列 (Queue)是另一种限定性的线性表,它只允许...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作