链表常用函数总结

2023-10-27

//创建单链表  
PNODE creat_list()
{
	int len;
	int i;
	int val;
	PNODE pHead=NULL;
	pHead=(PNODE)malloc(sizeof(NODE));
	if(NULL==pHead)
	{
		printf("分配内存失败,请重新输入"); 
	}
	PNODE pTail=pHead;
	pTail->Next=NULL;
	printf("请您输入需要链表的的个数%d",len); 
	scanf("%d",&len);
	for(i=0;i<len;i++)
	{
		printf("请您输入链表的%d个节点的值",i+1);
		scanf("%d",&val);
		PNODE pNew=(PNODE)malloc(sizeof(NODE));
		pNew->data=val;
		pTail->Next=pNew;
		pNew->Next=NULL;
		pTail=pNew;
	}
	return pHead;
}
//遍历输出 
void traverse_list(PNODE pHead)
{
   PNODE p=NULL;
   p=pHead->Next;
   while(p)
    {
	    printf("%d ",p->data);
    	p=p->Next;
    }	
    printf("\n");
    return;
}
//判断是否为空 
bool empty_list(PNODE pHead)
{
	if(NULL==pHead->Next)
	return true;
	else
	return false;
}
//求链表长度 
int length_list(PNODE pHead)
{
	
	PNODE p=pHead->Next;
	int len=0;
	while(NULL!=p)
	{
		++len;
		p=p->Next;
	}
	return len;
}
//排序 
void sort_list(PNODE pHead)
{
	int i,j,t;
	int len=length_list(pHead);
	PNODE p,q;
	for(i=0,p=pHead->Next;i<len-1;i++,p=p->Next)
	{ 
		for(j=i+1,q=p->Next;j<len;j++,q=q->Next)
		{
			if(p->data>q->data)//类似于数组中的:a[i]>a[j] 
			{
				t=p->data;//类似于数组中的:a[i]>a[j] 
				p->data=q->data;//a[i]=a[j]
				q->data=t;//a[j]=t
			}
		}
	}
return;
}
//在pHead所指向链表的第pos个节点的前面插入一个新节点,该节点的值是val,并且pos的值是从1开始 
bool insert_list(PNODE pHead,int pos,int val )
{
	int i=0;
	PNODE p=pHead;
	while(NULL!=p&&i<pos-1)
	{
		p=p->Next;
		i++;
	}
	if(i>pos-1||NULL==p)
	return false;
	PNODE pNew=(PNODE)malloc(sizeof(NODE));
	if(NULL==pNew)
	{
		printf("动态内存分配失败!\n");
	    exit(-1);
	}
	pNew->data=val;
	PNODE q=p->Next;
	p->Next=pNew;
	pNew->Next=q;
	return true;
}
//删除某个节点的值 
bool delete_list(PNODE pHead,int pos,int *pVal)
{
	int i=0;
	PNODE p=pHead;
	while(NULL!=p->Next&&i<pos-1)
	{
		p=p->Next;
		i++;
	}
	if(i>pos-1||NULL==p->Next)
	return false;
	PNODE q=p->Next; 
	//存放被删除的那个 
	*pVal=q->data;
	//删除p节点后面的节点 
	p->Next=p->Next->Next;
	free(q);
	q=NULL;
	return true;
}

 完整代码如下:

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef struct st{
	int data;
	struct st*Next;
}NODE,*PNODE; 
PNODE creat_list();
void traverse_list(PNODE pHead);
bool empty_list(PNODE pHead);
int length_list(PNODE pHead);
void sort_list(PNODE pHead);
bool insert_list(PNODE pHead,int pos,int val );
bool delete_list(PNODE pHead,int pos,int *pVal); 
int main(void)
{
	PNODE pHead=NULL;
	int val;
	pHead=creat_list();
	traverse_list(pHead);
    if(delete_list(pHead,4,&val)){
    	printf("删除成功,您删除的元素是:%d\n",val);
	}
	else
	{
		printf("删除失败!您删除的元素不存在\n");
	}
	//insert_list(pHead,4,33);
	traverse_list(pHead);
	//int len=length_list(pHead);
	//printf("链表长度为%d\n",len);
	//sort_list(pHead);
	//traverse_list(pHead);
	/*if(empty_list(pHead))
	  printf("链表为空");
	else
	  printf("链表不空"); */
}
//创建单链表  
PNODE creat_list()
{
	int len;
	int i;
	int val;
	PNODE pHead=NULL;
	pHead=(PNODE)malloc(sizeof(NODE));
	if(NULL==pHead)
	{
		printf("分配内存失败,请重新输入"); 
	}
	PNODE pTail=pHead;
	pTail->Next=NULL;
	printf("请您输入需要链表的的个数%d",len); 
	scanf("%d",&len);
	for(i=0;i<len;i++)
	{
		printf("请您输入链表的%d个节点的值",i+1);
		scanf("%d",&val);
		PNODE pNew=(PNODE)malloc(sizeof(NODE));
		pNew->data=val;
		pTail->Next=pNew;
		pNew->Next=NULL;
		pTail=pNew;
	}
	return pHead;
}
//遍历输出 
void traverse_list(PNODE pHead)
{
   PNODE p=NULL;
   p=pHead->Next;
   while(p)
    {
	    printf("%d ",p->data);
    	p=p->Next;
    }	
    printf("\n");
    return;
}
//判断是否为空 
bool empty_list(PNODE pHead)
{
	if(NULL==pHead->Next)
	return true;
	else
	return false;
}
//求链表长度 
int length_list(PNODE pHead)
{
	
	PNODE p=pHead->Next;
	int len=0;
	while(NULL!=p)
	{
		++len;
		p=p->Next;
	}
	return len;
}
/*狭义的算法是与数据的存数方式密切相关
广义的算法是与数据的存储方式无关
泛型:
利用某种技术达到的效果就是:不同的存数方式,执行的操作一样的 
*/ 
//排序 
void sort_list(PNODE pHead)
{
	int i,j,t;
	int len=length_list(pHead);
	PNODE p,q;
	for(i=0,p=pHead->Next;i<len-1;i++,p=p->Next)
	{ 
		for(j=i+1,q=p->Next;j<len;j++,q=q->Next)
		{
			if(p->data>q->data)//类似于数组中的:a[i]>a[j] 
			{
				t=p->data;//类似于数组中的:a[i]>a[j] 
				p->data=q->data;//a[i]=a[j]
				q->data=t;//a[j]=t
			}
		}
	}
return;
}
//在pHead所指向链表的第pos个节点的前面插入一个新节点,该节点的值是val,并且pos的值是从1开始 
bool insert_list(PNODE pHead,int pos,int val )
{
	int i=0;
	PNODE p=pHead;
	while(NULL!=p&&i<pos-1)
	{
		p=p->Next;
		i++;
	}
	if(i>pos-1||NULL==p)
	return false;
	PNODE pNew=(PNODE)malloc(sizeof(NODE));
	if(NULL==pNew)
	{
		printf("动态内存分配失败!\n");
	    exit(-1);
	}
	pNew->data=val;
	PNODE q=p->Next;
	p->Next=pNew;
	pNew->Next=q;
	return true;
}
//删除某个节点的值 
bool delete_list(PNODE pHead,int pos,int *pVal)
{
	int i=0;
	PNODE p=pHead;
	while(NULL!=p->Next&&i<pos-1)
	{
		p=p->Next;
		i++;
	}
	if(i>pos-1||NULL==p->Next)
	return false;
	PNODE q=p->Next; 
	//存放被删除的那个 
	*pVal=q->data;
	//删除p节点后面的节点 
	p->Next=p->Next->Next;
	free(q);
	q=NULL;
	return true;
}

 

 

 

 /狭义的算法是与数据的存数方式密切相关
广义的算法是与数据的存储方式无关
泛型:
利用某种技术达到的效果就是:不同的存数方式,执行的操作一样的

题外话:你们的支持是我不懈的动力,还请大家多多支持
 

 

 

 

 

 

 

 

 

 

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

链表常用函数总结 的相关文章

  • 【硬件】以太网PHY芯片有三个时钟说明

    硬件以太网PHY芯片有三个时钟 对此进行了梳理 PHY芯片时钟的选择 PHY芯片中有3个时钟 Gtx clk Rx clk Tx clk 1 GTX CLK仅使用在GMII模式下 时钟频率为125M 发送数据时的时钟 2 RX CLK在GM
  • Altium Desinger - PCB 3D模型创建导出

    打开绘制好的PCB版图 点击File gt Export gt STEP 3D 输出保存 就可以被solidworks 打开导入 整机文件
  • 上海某高校线上期末题-核酸检测系统C++实现

    上海某高校线上期末题 核酸检测系统C 实现 注意 本博客只是以学习交流和记录学习内容为主 分享自己的一些见解和思路 如有不当之处 请告知 试题内容 考核要求 项目文件地址 在github上开源 https github com hudisc
  • 如何在PADS中添加表面型测试点

    在PCB 设计中 我们经常需要对某些信号线增加一些测试点 以便在产品调试中对其信号进行测试 在PADS Layout POWERPCB 中添加测试点时 默认的是以标准过孔STANDARDVIA 作为测试点 但这是通孔方式的测试点 为了节省测

随机推荐

  • Spring更简单的使用方法

    前面介绍了一些最基本的存储和读取Bean对象的方法 但是在Spring中已经基本不这样使用了 因此这一篇博客就来介绍一下更简单的存储和读取Bean对象的方法而想要更简单的存储和读取最核心的就是使用注解 下面一起来看看吧 目录 一 存储Bea
  • Cherry-Pick

    版权声明 本公众号发布的所有文章 均属于原创 版权归本公众号所有 未经允许 不得转载 一 前言 在实际工作开发中 会遵循标准的 Git Work flow 对待不同的功能 会切出不同的分支进行 coding 所以 基于什么基准分支切出来的功
  • 过采样4:提高ADC分辨率实例(终篇)

    原文来自公众号 工程师看海 公众号后台回复 过采样 有更多资料 这应该是过采样系列的最后一篇文章 经常有同学在使用FPGA 单片机或者DSP进行过采样时没有正确设计代码 导致结果异常 有些结果看似正常 而实际却没有意义 这篇文章涉及到简单的
  • Unity 判断 鼠标/触摸 位置是否在指定Ui上,非射线检测方式。触屏移动物体。

    事出有因 1 项目的触摸点击事件 并且有手指缩放 移动功能 2 unity本身支持touch功能 这个不多说 3 当做手指缩放 移动的时候就要判断touch点位置了 但是如果不加任何判断则会乱套 如 本来想移动A 让A跟随 手指touch
  • 分布式事务中2PC与3PC的区别

    分布式事务中2PC与3PC的区别 2017 04 02 19 46 442人阅读 评论 0 收藏 举报 分类 Java知识 1 版权声明 本文为博主原创文章 未经博主允许不得转载 目录 协调者 在分布式系统中 每一个机器节点虽然都能明确的知
  • Pandas读取Excel文件XLRDError: Excel xlsx file; not supported

    问题背景 工作中大部使用Pandas分处理的数据都是以csv后缀结尾的文件 但是突然换成xlsx后缀的表格之后 出现的一些错误 问题现象 XLRDError Excel xlsx file not supported usr local l
  • pointer-event属性详解

    一 pointer event属性可以指定在什么情况下元素可以成为鼠标事件 二 取值 1 pointer event auto 默认值 对于svg元素 该值与visiblePainted效果相同 2 pointer event none 元
  • X的N次方求解——pow(x,n)实现

    最近看到这样的一个题目求X的N次方 自己想了一些解决办法 记录一下留作日后参考 求X的N次方 首先暴力求解 int exp int x int n int ret 1 for int i 0 i lt n i ret x return re
  • 阅读桑迪潘·戴伊的《Python图像处理实战》笔记十一

    十一 图像处理中的深度学习 图像检测等 1 检测目标的全卷积模型 YOLOv2 1 使用卷积神经网络检测目标 两个步骤 首先 使用小而紧密裁剪的图像训练卷积神经网络进行图像分类 其次 使用不同窗口大小的滑动窗口和事先学习该窗口内的测试图像进
  • 高性能的iocp网络设计思路

    IOCP是什么就不用介绍了 为什么要用IOCP就更不用提及 这里我们只简单讨论IOCP开发的一个思路 即能提高性能又能隆低开发复杂性 即能提高性能又能隆低开发复杂性 觉得我说的有矛盾吗 不是复杂的代码才能换来高效吗 其实不一定 我认为简单是
  • 用C语言编写程序,将多个字符串排序输出

    1 有三个字符串分别是 hello bit world 然后排序之后输出的顺序为 bit hello world int main char str1 100 char str2 100 char str3 100 char tmp 100
  • 【Oracle】事务的提交与回滚

    一 数据库事务 数据库事务 Database Transaction 是指作为单个逻辑工作单元执行的一系列操作 事务处理可以确保除非事务性单元内的所有操作都成功完成 否则不会永久更新面向数据的资源 通过将一组相关操作组合为一个要么全部成功要
  • 农村水利水电与水土保持

    授课 福师大张思鹏sunnyact 泉舟时代 主要内容 简介 做出一款能实时通报水利水电与水土相关的并能及时发送到指定相关人员手机短信 思路 通过水利局农村水利水电与水土保持处官网参考 百度脑图分享 https naotu baidu co
  • Docker容器如何连接网络+容器间网络互通+Docker网络模式+自定义网络+网络打通

    Docker网络 问题 Docker容器如何连接网络 Docker容器之间能否接通网络 Docker容器之间可以通过名称ping通吗 能否自定义一个网络 那么 我们带着几个问题来学习docker的网络 Docker容器是如何连接网络的 我们
  • 焉建伟:3.30黄金今日跌破1700关口如何操作,黄金原油实时操作建议

    国际黄金行情走势分析 从昨日盘整近2周的箱体破位之后黄金的行情就非常明朗了 今日就是一个反弹做空的基调不用多想 而对于长期的横盘整理之后出现破位方向明朗了 点位就并不是那么重要 今天这个行情很多人可能都在等着1716 17附近去参与空单 事
  • 在Java中以编程方式将PSB转换为PDF,JPG或PSD

    PSB Photoshop Big 文件扩展名用于存储与图形有关的大量信息 可以使用Java编程语言轻松地将PSB文件转换为PDF JPG或PSD格式 让我们学习以下各节以探讨PSB文件转换 使用Java以编程方式将PSB转换为PDF 使用
  • 51单片机之蜂鸣器模拟钢琴(代码详解)——起风了

    目录 前言 正文 乐理 程序 补充 前言 最近心血来潮 想要用蜂鸣器播放音乐 全损音质 于是最初的想法诞生了 但是我总不能每次想听歌都敲一遍蜂鸣器的代码吧 有没有什么办法只需要敲一遍的代码便可以实现听歌自由呢 相对自由 也就是每次写歌只需要
  • 数据清洗和特征选择

    数据清洗和特征选择 数据清洗和特征挖掘的工作是在灰色框中框出的部分 即 数据清洗 gt 特征 标注数据生成 gt 模型学习 gt 模型应用 中的前两个步骤 灰色框中蓝色箭头对应的是离线处理部分 主要工作是 从原始数据 如文本 图像或者应用数
  • File格式转换MultipartFile格式的四种方式例子

    可以看到MultipartFile是个接口 转成MultipartFile格式则需要转成实现MultipartFile接口的实现类即可 如下选择转成用MockMultipartFile实现 首先 需要先引入依赖包
  • 链表常用函数总结

    创建单链表 PNODE creat list int len int i int val PNODE pHead NULL pHead PNODE malloc sizeof NODE if NULL pHead printf 分配内存失败