数据结构_链表基本操作的实现_代码_例题

一、基本操作实现

1.按位序插入(带头节点)

2.按位序插入(不带头节点)

3.指定结点的后插操作

4.指定结点的前插操作

5.按位序删除(带头节点)

6.指定结点的删除

7.按位查找,返回第i个元素(带头结点)

8.按值查找

9.求表的长度

10.尾插法建立单链表

11.头插法建立单链表(可用于链表的逆置) 

二、例题

1.有序链表的合并,不允许有重复数据


一、基本操作实现

1.按位序插入(带头节点)

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

//按位序插入(带头节点)
bool ListInsert(LinkList &L,int i,ElemType e){
	if(i<1) return false;
	LNode *p;	//指针p指向当前扫描到的结点 
	int j = 0;	//当前p指向的是第几个结点 
	p = L;	//L指向头结点,头结点不存数据 
	while(p != NULL && j<i-1){
		p = p->next;
		j++;
	}
	if (p == NULL) return false;
	LNode *s = (LNode *)malloc(sizeof(LNode));
	s->data = e;
	s->next = p->next;
	p->next = s;
	return true;
} 

2.按位序插入(不带头节点)

//按位序插入(不带头节点)
bool ListInsert(LinkList &L,int i,ElemType e){
	if(i<1) return false;
	if (i == 1){	//插入第1个结点的操作与其他结点不一样 
		LNode *s = (LNode *)malloc(sizeof(LNode));
		s->data = e;
		s->next = L;
		L = s;
		return true;
	} 
	LNode *p;	//指针p指向当前扫描到的结点 
	int j = 0;	//当前p指向的是第几个结点 
	p = L;	//L指向头结点,头结点不存数据 
	while(p != NULL && j<i-1){
		p = p->next;
		j++;
	}
	if (p == NULL) return false;
	LNode *s = (LNode *)malloc(sizeof(LNode));
	s->data = e;
	s->next = p->next;
	p->next = s;
	return true;
} 

3.指定结点的后插操作

//指定结点的后插操作
bool InsertNextNode(LNode *p,ElemType e){
	if (p == NULL) return false;
	LNode *s = (LNode *)malloc(sizeof(LNode));
	if (s == NULL) return false;
	s->data = e;
	s->next = p->next;
	p->next = s;
	return true;
} 

4.指定结点的前插操作

思路:先后插将位置占住,然后再交换前后两个的结点的data。

//指定结点的前插操作
bool InsertNextNode(LNode *p,ElemType e){
	if (p == NULL) return false;
	LNode *s = (LNode *)malloc(sizeof(LNode));
	if (s == NULL) return false;
	s->next = p->next;
	p->next = s;
	s->data = p->data;
	p->data = e; 
	return true;
} 

5.按位序删除(带头节点)

//按位序删除(带头节点)
bool ListDelet(LinkList &L,int i,ElemType &e){
	if(i<1) return false;
	LNode *p;	//指针p指向当前扫描到的结点 
	int j = 0;	//当前p指向的是第几个结点 
	p = L;	//L指向头结点,头结点不存数据 
	while(p != NULL && j<i-1){
		p = p->next;
		j++;
	}
	if (p == NULL) return false;
	if (p->next == NULL) return false;
	LNode *q = p->next;
	e = q->data;	//用e返回删除元素的值 
	p->next = q->next;
	free(q);
	return true;
} 

6.指定结点的删除

//指定结点的删除
bool DeletNode(LNode *p){
	if (p == NULL) return false;
	LNode *q = p->next;
	p->data = p->next->data;
	p->next = q->next;
	free(q);
	return true;
} 

7.按位查找,返回第i个元素(带头结点)

//按位查找,返回第i个元素(带头结点)
LNode * GetElem(LinkList L,int i){
	if(i<0) return NULL;
	LNode *p;
	int j = 0;
	p = L;
	while(p != NULL && j<i){
		p = p->next;
		j++;
	}
	return p;
} 

8.按值查找

//按值查找
LNode * LocateElem(LinkList L,ElemType e){
	LNode *p = L->next;
	while(p != NULL && p->data != e){
		p = p->next;
	}
	return p;
} 

9.求表的长度

//求表的长度
int Length(LinkList L){
	int len = 0;
	LNode *p = L;
	while(p->next != NULL){
		p = p->next;
		len ++;
	}
	return len;
} 

10.尾插法建立单链表

//尾插法建立单链表
LinkList List_TailInsert(LinkList &L){
	int x;
	L = (LinkList)malloc(sizeof(LNode));
	LNode *s,*r = L;
	scanf("%d",&x);
	while(x != 9999){
		s = (LNode *)malloc(sizeof(LNode));
		s->data = x;
		r->next = s;
		r = s;
		scanf("%d",&x);
	}
	r->next = NULL;
	return L;
}

11.头插法建立单链表(可用于链表的逆置) 

//头插法建立单链表(可用于链表的逆置) 
LinkList List_HeadInsert(LinkList &L){
	LNode *s;
	int x;
	L = (LinkList)malloc(sizeof(LNode));
	L->next = NULL;	//初始为空链表 
	scanf("%d",&x);
	while(x != 9999){
		s = (LNode*)malloc(sizeof(LNode));
		s->data = x;
		s->next = L->next;
		L->next = s;
		scanf("%d",&x);
	}
	return L;
} 

二、例题

1.有序链表的合并,不允许有重复数据

#include<stdio.h>
#include<stdlib.h>

typedef struct LNode{
	int data;
	struct LNode *next;
}LNode,*LinkList;

//尾插法建立单链表
LinkList List_TailInsert(LinkList &L){
	int x;
	L = (LinkList)malloc(sizeof(LNode));
	LNode *s,*r = L;
	scanf("%d",&x);
	while(x != 9999){
		s = (LNode *)malloc(sizeof(LNode));
		s->data = x;
		r->next = s;
		r = s;
		scanf("%d",&x);
	}
	r->next = NULL;
	return L;
}

void ListPrint(LinkList L){
	LNode *p;
	p = L->next;
	while(p != NULL){
		printf("%d ",p->data);
		p = p->next;
	}
	printf("\n");
}

void MergeList_L(LinkList &LA,LinkList &LB,LinkList &LC){
	LNode *pa,*pb,*pc;
	pa = LA->next;
	pb = LB->next;
	LC = LA;
	pc = LC;
	while(pa && pb){
		if(pa->data < pb->data){
			pc->next = pa;
			pc = pa;
			pa = pa->next;
		}
		else if(pa->data > pb->data){
			pc->next = pb;
			pc = pb;
			pb = pb->next;
		}
		//这里解决了不允许有重复数据的要求 
		else{
			pc->next = pa;
			pc = pa;
			pa = pa->next;
			pb = pb->next;
		}
	}
	pc->next = pa?pa:pb;
	delete LB;
}

int main(){
	LinkList LA,LB,LC;
	List_TailInsert(LA);
	ListPrint(LA);
	List_TailInsert(LB);
	ListPrint(LB);
	MergeList_L(LA,LB,LC);
	ListPrint(LC);
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/628341.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Axure RP移动端交互元件库/交互原型模板

作品类型&#xff1a;元件库/原型模板 更新日期&#xff1a;2023-12-04 当前版本&#xff1a;V1.3 适用范围&#xff1a;App应用/小程序 Axure版本&#xff1a;Axure 9.0均可打开 文件大小&#xff1a;36.7M 历时两个月制作并整理了手机移动端常用的75种组件、90个常用界面模板…

Spring注解驱动开发

1、Spring注解驱动开发图解

英语单词量测试

网址&#xff1a;https://preply.com/en/learn/english/test-your-vocab 测试结果&#xff1a; 细节&#xff1a;英语母语者有20000-35000个单词的词汇量&#xff0c;8岁孩子的词汇量在8000个左右。而不是我们教育系统里说的&#xff0c;6000个单词足够用了。足够用&#xff0…

MSR810-LM快速配置通过LTE模块上网

正文共&#xff1a;1111 字 13 图&#xff0c;预估阅读时间&#xff1a;1 分钟 之前买了一个无线版本的MSR810-W&#xff08;淘了一台二手的H3C企业路由器&#xff0c;就用它来打开网络世界的大门&#xff09;&#xff0c;并整理了一份快速配置&#xff08;脚本案例来了&#x…

在pycharm添加pyqt5外部工具插件

一&#xff1a;查看环境所在位置以及安装pyqt5库 1、打开anaconda&#xff0c;输入以下命令&#xff0c;查看环境名&#xff0c;以及环境所在位置。 conda info --envs 从图中得知以下信息&#xff0c;下面根据自己实际情况&#xff0c;记住环境名和路径 ①环境名是&#xf…

redis报错500

之前自己举一反三把value也给序列化了&#xff1a; 然后报错了&#xff1a; 原因是这里传入的是Integer类型&#xff0c;序列化的话就变为string类型了

【Linux】-IP地址、主机名配置[5]

目录 一、IP和主机名 1、IP地址 2、特殊IP地址 3、主机名 4、在Linux中修改主机名 5、配置主机名映射 二、虚拟机配置固定IP 1、为什么需要固定IP 2、在VMware Workstation中配置固定ip 一、IP和主机名 1、IP地址 每一台联网的电脑都会有一个地址&#xff0c;用于和…

ALV 红绿灯

前言 在ABAP ALV中&#xff0c;LIGHTS_FIELDNAME参数是用于实现行级视觉指示或“灯光效果”的一个重要设置项&#xff0c;尤其适用于标记或突出显示列表中符合特定条件的行。这个参数通常是在定义ALV布局&#xff08;使用结构如LVC_S_LAYOUT或通过SALV类的相应方法&#xff09;…

IDEA 每次启动都显示选择项目页面

IDEA版本&#xff1a;2021.3.3 打开 Settings > Appearance & Behavior > System Settings 取消勾选 Reopen projects on startup 然后下次启动 IDEA 会显示选择项目页面

Flutter 3.22 发布,快来看看有什么更新吧?

Flutter 3.22 发布&#xff0c;快来看看有什么更新吧&#xff1f; 本次 Flutter 跟随 Google I/O 发布的版本是 3.22 &#xff0c;该版本主要还是带来了 Vulkan backend 和 Wasm Native 的落地&#xff0c;另外还有一个重点就是 Dart macros &#xff0c;但是它更多只是一个预…

2025年第十一届北京国际印刷技术展览会

2025年第十一届北京国际印刷技术展览会 展览时间&#xff1a;2025年5月15-19日 展览地点&#xff1a;北京中国国际展览中心&#xff08;顺义馆&#xff09; 主办单位&#xff1a;中国印刷及设备器材工业协会中国国际展览中心集团有限公司 承办单位&#xff1a;北京中印协华港国…

2023年国赛高教杯数学建模B题多波束测线问题解题全过程文档及程序

2023年国赛高教杯数学建模 B题 多波束测线问题 原题再现 单波束测深是利用声波在水中的传播特性来测量水体深度的技术。声波在均匀介质中作匀速直线传播&#xff0c;在不同界面上产生反射&#xff0c;利用这一原理&#xff0c;从测量船换能器垂直向海底发射声波信号&#xff…

ITIL4之IT服务战略

战略和IT战略 战略 的概念最早源于军事领域&#xff0c;意在通过对战争全局的精心规划和指挥&#xff0c;利用有限资源高效达成政治和军事目标。这一思想逐渐扩展到商业、管理乃至信息技术领域&#xff0c;成为指导长远发展和资源配置的核心框架。 IT战略 是将军事战略的智慧…

内网安全-隧道搭建穿透上线FRPNPSSPPNgrokEW项目

旨在代理连接肉鸡后实现本地渗透肉鸡网络架构 Linux&#xff1a;Proxychains Windows&#xff1a;Sockscap Proxifier 穿透项目&#xff1a;Ngrok Frp Spp Nps EW(停更) 优点&#xff1a;穿透加密数据&#xff0c;中间平台&#xff0c;防追踪&#xff0c;解决网络问题 https://…

第二步 完善MBR

文章目录 前言一、什么是MBR&#xff1f;二、我们需要什么样的MBR&#xff1f;三、设计我们的MBR&#xff01;1、打印“1 MBR”2、加载次引导程序——loader 四、实践检验&#xff01; 查看系列文章点这里&#xff1a; 操作系统真象还原 前言 在上一篇文章 第一步 从启动BIOS开…

保障数据安全:数据防泄漏加密软件功能对比

在数字时代&#xff0c;数据安全成为企业必须重视的关键问题。随着信息技术的飞速发展&#xff0c;数据的传输、存储和处理变得愈发便捷&#xff0c;但这也为数据泄露带来了更大的风险。为了应对这一挑战&#xff0c;数据防泄漏加密软件应运而生&#xff0c;成为保障数据安全的…

解决 : ERROR: Rosdep experienced an error: The read operation timed out

问题描述 安装过程中的 rosdep update 报错超时问题&#xff0c;需要访问github进行更新&#xff0c;由于国内网络受限&#xff0c;不能正常访问github&#xff0c;从而导致 rosdep update超时。 解决方法 修改rosdep的python源文件&#xff0c;通过代理地址 https://ghprox…

华为认证大数据是什么?华为认证大数据有用吗?

华为大数据是用来搜集整理大数据&#xff0c;提供解决方案的数据中心。华为大数据解决方案是华为公司推出的一种综合性云解决方案&#xff0c;主要针对广告营销、电商、车联网等大数据应用场景的云计算大数据方案&#xff0c;帮助企业用户构建大数据平台&#xff0c;解决企业的…

【源码】购物返利源码每日分红 服务器打包完整版淘宝/京东/亚马逊等刷单平台源码

购物返利源码每日分红 服务器打包完整版淘宝/京东/亚马逊等刷单平台源码 好友分享的购物返利系统带分红&#xff0c;功能很强大的&#xff0c;类似矿机那种源码&#xff01;请勿违法用途&#xff01;源码和数据库都不缺。简单看了下搭建还是非常简单的&#xff01; 东西如下图&…

数据结构与算法学习笔记九---循环队列的表示和实现(C++)

目录 前言 1.为什么要使用循环队列 2.队列的顺序存储方式的实现 1.定义 2.队列初始化 3.销毁 4.清空队列 5.队列是否为空 6.队列长度 7.队头 8.入队 9.出队 10.遍历队列 11.完整代码 3.参考资料 前言 这篇文章介绍循环队列的表示和用法。 1.为什么要使用循环队…