[数据结构(C语言)]单链表的定义,实现初始化、创建、插入、增、删、改、查等基本操作

2023-11-19

建议新人收藏使用!

首先,让我们回顾一下顺序表的优缺点:

1、优点:

随机存取;

存储空间利用率高。

2、缺点:

插入、删除效率低;

必须按事先估计的最大元素个数分配连续的存储空间,难以临时扩大。

采用链式存储结构的线性表称为链表。

链表有单链表、循环链表和双向链表等多种类型。

链表中,不仅需要存储每个数据元素,还需存储其直接后继的存储地址,这两部分数据信息组

合起来称为结点。

结点包括两类域:

存储数据元素信息的域称为数据域

存储直接后继存储地址的域称为指针域

每个结点只包含一个指针域的链表,称为单链表。

最后一个结点的指针域为NULL,在图中记为^。

first是头指针,指向链表中的第一个结点,链表中的第一个结点称为头结点

目录

头文件及函数声明等:

菜单函数:

初始化链表:

显示元素:

添加元素:

​编辑

插入元素:

​编辑

删除元素:

​编辑

 查找元素:

修改元素:

元素排序:

元素备份:

主函数:


头文件及函数声明等:

#include<stdio.h>   //提供system()
#include<stdlib.h>  //提供malloc()和free()
#include <malloc.h> //开辟空间
#include <string.h> //提供strcpy()等

typedef  int ElemType;
typedef struct node;
typedef int Startus;//获得元素的操作

//结点结构体
typedef struct node
{
	ElemType element ; //结点的数据域
	struct node *link; //结点的指针域(指向节点的指针)
}Node;

//头结点结构体
typedef struct singleList
{
	struct node * first;//头结点
	int n;

}SingleList;

SingleList slist;//结构体变量

void menu( );
void init(SingleList *L);
void add(SingleList *L);
void display(SingleList *L);
void del(SingleList * L,int i);
Node * find(SingleList * L,int i);
void insert(SingleList *L,int i);
int change(SingleList *L,int x,int y);
void bubbleSort(SingleList *L);
void save(SingleList *L);

菜单函数:

//定义系统菜单√
void menu( )
{
	int op,i,x,y;
	printf("==================================\n");
	printf("------单链表的基本操作 V1.6-----\n");
	printf("0. 初始化单链表√            \n");
	printf("1. 添加元素√                \n");
	printf("2. 插入元素√                \n");
	printf("3. 删除元素√                \n");
	printf("4. 修改元素                \n");
	printf("5. 查找元素√                \n");
	printf("6. 升序排序元素            \n");
	printf("7. 备份顺序表              \n");
	printf("8. 结束操作√                \n");
	printf("9. 显示操作√                \n");
	printf("==================================\n");
 
	printf("请选择操作的菜单项:");
	scanf("%d",&op);
	switch(op){
	case 0:
		init(&slist);
		break;
	case 1:
		add(&slist);
		break;
	case 2:
		printf("请输入要插入的位置:");
		scanf("%d",&i);
		insert(&slist,i);
		break;
	case 3:
		printf("请输入你要删除的元素的位置:");
		scanf("%d",&i);
		del(&slist,i);
		break;
	case 4:
		printf("\n===========【修改元素】===============\n");
		printf("请输入要修改的元素的值:");
		scanf("%d",&x);
		printf("请输入修改后的元素的值:");
		scanf("%d",&y);
	    if(change(&slist,x,y))
		{
			printf("恭喜,修改成功!\n");
		}
		else
		{
			printf("对不起,修改失败!\n");
		}
		break;
	case 5:
		printf("\n===========【查找元素】===============\n");
		printf("请输入要查找的元素:");
		scanf("%d",&i);
	    find(&slist,i);
		break;
	case 6:
		bubbleSort(&slist);
		break;
	case 7:
		save(&slist);
		break;
	case 8:
		exit(0); //结束操作
		break;
	case 9:
		display(&slist);
		break;
	default: 
		printf("你选择的菜单项不存在,请重新选择!\n"); 
		break;
	}
	system("pause");
	system("cls");
}

效果如下:

初始化链表:

//初始化单链表√
void init(SingleList *L)
{
	printf("\n==========【初始化单链表】==============\n");
	L->first=NULL;
	L->n=0;
	printf("顺序表初始化成功!\n");

	system("pause");
	system("cls");
}

效果如下:

显示元素:

//显示元素√
void display(SingleList *L)
{
	Node *p;
	printf("\n===========【显示元素】===============\n");
	if(L->n==0)
		printf("此单链表为空表,无法输出元素!\n");
	p=L->first;
	printf("该单链表中所有元素如下:");
	while(p)
	{
		printf("%-4d",p->element);
		p=p->link;
	}

	system("pause");
	system("cls");
}

效果如下:

添加元素:

//添加元素√
void add(SingleList *L)
{
	int i,m,x;
	Node *q,*last; //last永远指向最后一个结点
	last=L->first;//在未创建结点时,last没有值
	printf("\n===========【添加元素】===============\n");
	printf("请输入要添加的元素个数:");
	scanf("%d",&m);

	for(i=1;i<=m;i++)
	{
		printf("请输入第%d个元素的值:",i);
		scanf("%d",&x);

		q=(Node *)malloc(sizeof(Node));//为新结点开辟新内存

		q->element=x;    //新结点的数据域赋值
		//q->link=NULL;

		if(last==NULL)//判断是否是空表
		{
			L->first=q;
			last=q;
		}
		else
		{
			//尾插法深刻理解:
			last->link=q; //第一步
			last=q;       //第二步
		}
		L->n++;
	}
		printf("元素添加成功!\n");	
	system("pause");
	system("cls");
}

插入元素:

//插入元素√
void insert(SingleList *L,int i)
{
	Node *p,*q; 
	int x,j;
	printf("\n===========【插入元素】===============\n");
	printf("请输入要插入的新结点数据域:");
	scanf("%d",&x);

	if (i<0||i>L->n)
	{
		printf("越界!\n");
	}

	p=L->first;

	for ( j=0;j<i-1;j++) 
	{
		p=p->link; //从头结点开始查找ai
	}
	
	q=(Node *)malloc(sizeof(Node));//为新结点开辟新内存
	q->element=x;    //新结点的数据域赋值

	if(i>0) 
	{ 
		q->link=p->link; //新结点插在单链表中间位置的情况
		p->link=q;
	}
	else 
	{ 
		q->link=L->first; //新结点插在a0之前,成为新的头结点
		L->first=q;
	}

	L->n++; //表长增加1

	printf("插入成功!\n");
}

 

删除元素:

//删除元素√
void del(SingleList * L,int i)
{
	int j;
	Node *p,*q;
	printf("\n===========【删除元素】===============\n");
	if(!L->n)
		printf("该单链表为空!!\n");
	if(i<1||i>L->n)
		printf("没有该元素!!\n");

	q=L->first;
	p=L->first;

	for(j=0;j<i-1;j++)
		q=q->link;
	if(i==1)
	{
		L->first=L->first->link; //删除头节点
	}
	else
	{
		p=q->link;    //p指向ai
		q->link=p->link;//从单链表中删除P所指向的结点
	}
	free(p);//释放空间
	L->n--; //长度减一
	
	printf("删除成功!\n");
}

 

 查找元素:

//查找元素√
Node * find(SingleList * L,int x)
{
	Node *p,*q=NULL;//p用来追踪每个结点,q用来保存查找到的元素的地址
	printf("\n===========【查找元素】===============\n");
	if(L->n==0)
	{
		q=NULL;
		printf("该表为空表!\n");
	}
	p=L->first;
	while(p)
	{
		if(p->element==x)
		{
			q=p;
			break;
		}
		p=p->link;  //p往后移动
	}
	printf("恭喜,成功查找到值为%d的元素!\n",x);
}

修改元素:

//修改元素
int change(SingleList *L,int x,int y)
{
	Node *t=find(L,x);
	printf("\n===========【修改元素】===============\n");
	if(t!=NULL)
	{
		t->element=y;
		return 1;
	}
	else
	{
		return 0;
	}
}

元素排序:

//元素排序√
void bubbleSort(SingleList *L)
{
	int i,j,t; //t是临时变量
	Node * p, *q; 
	p=L->first;
	q=p->link;
	printf("\n===========【元素排序】===============\n");

	if(p==NULL||q==NULL)  
	{
		printf("该链表为空!\n");
	}
	else
	{
	for(i=0;i<L->n -1;i++)//比较的躺数
	{
		for(j=0;q!=NULL;j++)//比较的次数
		{
			if(p->element > q->element)
			{
				t=p->element;
				p->element=q->element;
				q->element=t;
		      }
			p=p->link;
			q=q->link;
		}
		p=L->first;
		q=p->link;
	}
	printf("排序成功!\n");
	}
}

元素备份:

//元素备份√
void save(SingleList *L)
{
	int i;
	Node *q=L->first;
	FILE *fp;
	printf("\n===========【备份元素】===============\n");
	 if((fp=fopen("student.txt", "w+"))==NULL); //以只写形式打开文件,若失败,则返回NULL,并新建一个文件
	 {
		 for (i=0;i<L->n;i++)
		 {
			 fprintf(fp, "%d\n",q->element);
			 q=q->link;
		 }
	 }
	printf("保存成功!!!\n");
	fclose(fp);  //关闭文件

	system("pause");
	system("cls");
}

主函数:

//主函数
int main()
{
	while(1)
	{
		menu();
	}
	return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[数据结构(C语言)]单链表的定义,实现初始化、创建、插入、增、删、改、查等基本操作 的相关文章

  • taking address of temporary错误

    前些天将一个项目从VS2013移植到Qt上 遇到了这样一个问题 Dispatch gt XCDispatchMessage linev error taking address of temporary这段代码从VS2013通过了编译 但是
  • 第十三章 公告板与粒子系统 标签: ogre公告板粒子系统ogre粒子系统

    Ogre编程入门与进阶 第十三章 公告板与粒子系统 标签 ogre公告板粒子系统ogre粒子系统 2015 07 05 14 41 1365人阅读 评论 1 收藏 举报 分类 Orge模块 16 版权声明 本文为博主原创文章 未经博主允许不
  • macbook百度网盘下载保存的文件在哪❓找不到

    困扰我好久的问题终于被我解决了 之前在AppStore里下载百度网盘 然后在百度网盘里下载文件 除了能直接打开以后 怎么都找不到文件位置 后来我终于知道了 是因为在AppStore里下载的百度网盘根本不是mac版的 如果你想下载mac版的百
  • 安卓TabLayout的使用

    安卓TabLayout的使用 我们在进行安卓开发时 常常会使用到ViewPager 为了展示更美观的效果 我们经常会选择第三方的诸如TabPageIndicator等配合ViewPager使用 但是TabPageIndicator已经很老了
  • 简单地使用webpack进行打包

    下面的webpack是4 14 0版本的 当时我学的 更新太快了 现在5 10 0了 你学习的时候 用的是最新的 就不要往下看啦 官方文档已经更新教程了 这是我看5 10 0教程后 简单搭建的打包demo 可以参考 或者你也自己去官网看文档
  • SpringCloud-Alibaba Nacos

    Nacos 简介 为什么叫Nacos 前四个字母分别为Naming和Configuration的前两个字母 最后的s为Service 是什么 一个更易于构建云原生应用的动态服务发现 配置管理和服务管理平台 Nacos Dynamic Nam
  • STM32的串口中断详解

    目录 中断配置 中断服务函数 1 中断服务函数名称查找 2 中断服务函数 3 可以选择的串口中断类型 extern u8 USART RX BUF USART REC LEN extern u16 USART RX STA 中断配置 使能接
  • js 字符串拼接的4种方法

    一 使用连接符 把想要连接的字符串串起来 let shy 帅哥 let a 我是 shy console log a 我是帅哥 二 模板字符串 模板字符串 template string 是增强版的字符串 用反引号 标识 特点 1 字符串中
  • 20221129-1Spring_day03(资料来自黑马程序)

    Spring day03 今日目标 理解并掌握AOP相关概念 能够说出AOP的工作流程 能运用AOP相关知识完成对应的案例编写 重点掌握Spring的声明式事务管理 1 AOP简介 前面我们在介绍Spring的时候说过 Spring有两个核
  • 【HTML】修复选中项与实际后台控制的选中项不一致的问题

    项目场景 项目场景 系统项目中有一个需要通过后台传递选中项的下拉项 由于反复确认都无法主动更新 考虑到其他人推荐的 方法 也是没有效果的 例如 无效
  • 首个数字银行卡明年发行,广州出台区块链措施支持大湾区

    锌链接作为首个提出产业区块链的机构媒体 一直积极推动产业区块链落地 通过深度报道直戳行业痛点 通过分享会聆听行业声音 通过周报呈现行业大观 通过评论展现独特产业观察视角 本周 广州出台66条措施支持粤港澳大湾区金融发展 其中多项与区块链有关
  • CVPR 2023和ICLR 2023异常检测相关文章

    关键词 Anomaly Detection Outlier Detection Out of Distribution Abnomal Detecting Abnormal Detection Defect DetectionInspect
  • 两万字整理Fabric(超级账本) 配置文件 掌握了它就掌握了Fabric的核心

    导语 文章没有重复的地方 没有废话 如果能帮助到你 那是我的荣幸 记得一键三连哟 Fabric 配置文件详解 一 四个核心配置文件 二 Fabric 的核心配置文件 三 网络启动步骤 1 生成认证证书 crypto config yaml
  • JS 时区时间转换

    业务场景 页面服务器时间是东八区时间 页面 JS 功能需要对比服务器时间和用户本地时间 为兼容世界各地时间 需要将用户本地时间转换为东八区时间 基本概念 格林威治时间 格林威治子午线上的地方时 或零时区 中时区 的区时叫做格林威治时间 也叫
  • cocos2d-x 之 适配分辨率全屏的方法

    原文出处 https blog csdn net yixiao3660 article details 54316348https www jianshu com p 0d6787e31112 http dualface github io
  • 从架构师的角度看服务器端架构点滴

    任何服务器端的架构设计 都是性能 一致性和成本三者的权衡 从我在目前的大规模互联网视频公司的负责APP服务器端的角度来讲 我主要关注以下几个点 业务 可靠性 性能 可维护性 一 业务 框架上保证业务的快速迭代 在性能要求不高的情况下 同步架
  • ubuntu 安装 python3.9

    一 相关背景 之前在dockerfile里面一直使用的是python3 8 忘记为什么选择这个版本了 想用python3 9 因为觉得3 8有点老了 而且3 9一个重要的feature 是把list作为默认的类型 不需要从typing 里面
  • 微信公众号实现微信支付(含前后端完整代码)

    刚做完公众号微信支付 记录一下 获取微信支付之前 要先获取用户的基本信息哦 前端使用uniapp开发的H5 小伙伴们可以照着改一下对应语法 首先来个微信支付的工具类 wxApi js 这里我放到了项目下的common目录下 代码如下 微信
  • Vue控制台警告: Added non-passive event listener to a scroll-blocking ‘touchmove‘ event. Consider markin

    翻译过来如下 违反 没有添加被动事件监听器来阻止 touchstart 事件 请考虑添加事件管理者 passive 以使页面更加流畅 原因是 Chrome51 版本以后 Chrome 增加了新的事件捕获机制 Passive Event Li

随机推荐

  • 修改vscode默认打开两个标签窗口

    vscode 默认打开两个标签窗口 设置能同时打开多个标签 打开以下这个路径C Users xx AppData Roaming Code User 在setting json中添加一行设置 workbench editor enableP
  • android获取view宽高的时机

    关键点 获取宽高应该在view的onLayout之后 这个时候 view已经确定算出宽高 error 在onCreate onResume方法中调用 用于获取TextView的宽度和高度都是0 private void getTextHei
  • 使用NDK编译C/C++文件生成在安卓中的可执行文件

    使用NDK编译C C 文件生成在安卓中的可执行文件 需求 要编译一个C文件 然后将他运行到安卓手机中 通过这个可执行文件可以获取一些硬件的参数信息 或者对已经有的信息进行修改 从而达到我们想要的效果 相关知识点记录 NDK Native D
  • HTTP POST请求json数据量过大的问题

    与第三方合作 需要提供数据上传接口给他们 联调时被他们的单条json数据量困扰到了 第三方接口联调 一条7M的json上传给我们 毫无意外的报错了 实体数据量太大 该如何修改以便适应大数据量的上传呢 在代码层面想不到解决方案 于是查看配置
  • GitHub Actions自动化部署+定时百度链接推送

    前言 最近用VuePress搭建了一个静态网站 由于是纯静态的东西 每次修改完文章都要重新打包上传很是麻烦 虽然vuepress theme vdoing主题作者提供了GitHub Actions自动化部署的教程文章 但是过于简陋且是19年
  • 在小项目中实践领域驱动设计(含详细代码和实践过程) #CSDN博文精选# #IT# #项目实践#

    大家好 小C将继续与你们见面 带来精选的CSDN博文 又到周一啦 上周的系统化学习专栏已经结束 我们总共一起学习了20篇文章 这周将开启全新专栏 放假不停学 全栈工程师养成记 在这里 你将收获 将系统化学习理论运用于实践 系统学习IT技术
  • 为什么Java不支持多继承,却搞了个Interface出来?

    多继承的问题在于无法找到一个合理的规则去初始化基类的数据 菱形继承中 两个子类分别调用父类构造函数进行初始化时 到底该调用谁 都调用的话 谁先谁后 C 的解决方案把这个问题丢给了使用者 也就是孙类 似乎是解决了问题 可是它忽视了子类并没有虚
  • 阿里巴巴编码规范习题

    因为工作需要 公司组里要求考阿里巴巴编程规范 于是我花了一天的时间看了一遍 然后刷了一些题 终于在第三次的时候考过了 考试是基于 阿里巴巴Java开发手册 一共50道题目 包括多选和单选 题目都是选择题 目前阿里云编程规范是出到V1 5 0
  • 算法:深度优先遍历和广度优先遍历

    什么是深度 广度优先遍历 图的遍历是指 从给定图中任意指定的顶点 称为初始点 出发 按照某种搜索方法沿着图的边访问图中的所有顶点 使每个顶点仅被访问一次 这个过程称为图的遍历 遍历过程中得到的顶点序列称为图遍历序列 图的遍历过程中 根据搜索
  • 类的数组成员变量的初始化

    使用STL标准模板库之后 编程时已经很少使用数组和指针 相反 多使用序列容器vector代替之 但事实并不这么理想 在迫不得已的情况下 我们还是会选择使用数组 这里介绍一下当数组作为类的成员变量时 应该怎么对它 数组 进行初始化 在类的构造
  • 日志LOG

    一 引言 1 1 日志介绍 用于记录系统中发生的各种事件 记录的位置常见的有 控制台 磁盘文件等 1 2 日志级别 日志级别从低到高 TRACE 堆栈 DEBUG 调试期 INFO 运行期 WARN 警告 ERROR 错误 FATAL 严重
  • 微信小程序实现一个遮罩层

    微信小程序实现遮罩层 开发中 遮罩层的使用场景很多 例如 loading的时候 例如搜索的时候等 以下是一个案例 点击页面的搜索框 在页面上添加一层遮罩层 显示搜索详情页 页面搜索框如下 页面最上面有一个搜索框 下面有一些其他UI元素
  • 微软解释关于Windows 10 收集用户数据那点事

    微软 Microsoft 在周一时发布关于Win10 收集用户数据的新细节 试图停止这场争议 早前 该软件巨头确认Win10收集用户数据并发送给微软 并声称这是用于改善整体用户体验 然而 这引发了人们对用户隐私以及用何种方式收集数据的关注
  • int、long、long long取值范围

    unsigned int 0 4294967295 int 2147483648 2147483647 unsigned long 0 4294967295 long 2147483648 2147483647long long的最大值 9
  • 美团外卖推荐关于用户新颖体验优化的技术探索

    外卖场景下 用户 复购 属性强 下单频次高 既想下单老商家 也会想换换 新口味 为更好平衡用户的复购 尝新体验 外卖推荐团队从2022年起开始持续投入 构建了外卖场景新颖性推荐的体系化解决方案 截止目前 外卖首页用户曝光新颖性累计提升19
  • 安装anconda以及在pycharm使用

    安装anconda 下载安装 配置虚拟环境需要通过anaconda来完成 anaconda的下载地址为 https docs conda io en latest miniconda html windows用户下载python3 8的mi
  • 蓝牙之四-Handler

    Handler机制 Handler允许用户发送和处理Message以及线程MessageQueue相关的可运行对象 每个Handler实例都对应一个单线程以及该线程的MessageQueue 当创建新的Handler时 该Handler将被
  • Kali搭建DVWA——Web靶场

    博主主站地址 微笑涛声 www cztcms cn 一 DVWA介绍 1 DVWA简介 DVWA是一款基于PHP和MYSQL开发的web靶场练习平台 集成了常见的web漏洞如sql注入 XSS 密码破解等常见漏洞 旨在为安全专业人员测试自己
  • SDL无法打开音频设备的问题:Couldn‘t open audio/video device: No available audio/video device

    解决中标麒麟下SDL无法打开音频设备的问题 root登录 首先就是一定要用root登录 这个可能是权限问题 否则后面实验不能成功 安装ALSA库 首先下载alsa lib https www alsa project org main in
  • [数据结构(C语言)]单链表的定义,实现初始化、创建、插入、增、删、改、查等基本操作

    建议新人收藏使用 首先 让我们回顾一下顺序表的优缺点 1 优点 随机存取 存储空间利用率高 2 缺点 插入 删除效率低 必须按事先估计的最大元素个数分配连续的存储空间 难以临时扩大 采用链式存储结构的线性表称为链表 链表有单链表 循环链表和