GDPU 数据结构 天码行空3

2023-09-22 10:45:09

一、【实验目的】

1、掌握建立单链表的基本方法。
2、掌握单链表的插入、删除算法的思想和实现

二、【实验内容】

仿照教材中的单链表实现例子,自己设计一个有序单链表,单链表中的数据元素为整型并递增有序。有序单链表的定义:
逻辑结构:有序线性表,数据元素递增有序
存储结构:链式
操作集合:初始化、插入、删除、撤销
(1)ListInitiate(L) 初始化线性表,生成一个空表L。
(2)ListInsert(L,x) 在有序表L中插入数据元素x,使得新表仍然有序。
(3)ListDelete(L,x) 删除有序表L中的数据元素x,若删除成功则返回1,不成功则返回0。
(4)Destroy(L) 撤销单链表
要求:
1.有序单链表的操作集合有如下操作:初始化、插入、删除、撤销,使用头文件单链表的代码。
2.编写主函数main()验证所设计的有序单链表是否能正确插入、删除。
提示:
1.插入操作时,从链表的第一个数据元素结点开始,逐个比较每个结点的data域值和x的值,当data小于等于x时,进行下一个结点的比较;否则就找到了插入结点的合适位置,此时申请新结点把x存入,然后把新结点插入;当比较到最后一个结点仍有data小于等于x时,则把新结点插入单链表尾。
2.删除操作时,从链表的第一个数据元素结点开始,逐个比较每个结点的data域值和x的值,当data不等于x时,进行下一个结点的比较;否则就找到了要删除的结点,删除结点后释放结点。如果到了表尾还没有找到值为x的结点,则链表中没有要删除的元素。

3. 实验源码

🍺 head.h

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
typedef struct node
{
	int data;
	node* next;
}SingleLinkedList;

void init(node* l)
{
	l->data = 0;//头结点的 data 可以记录链表的元素个数
	l->next = nullptr;
}//初始化建立头节点

void insertOne(node *l,int x)
{
	node* h = l;//head 前驱节点
	node* t = l->next;//tail 后继结点
	node* n = new node;
	n -> data = x;
//	cout << "debug" <<endl;
	while(t != nullptr)//找到第一个比 x 大的元素
	{
		if(t->data > x)
		{
			h->next = n;
			n->next = t;
			break;
		}
		h = t;
		t = t->next;
	}
	if(t == nullptr)//处理x插入链表尾部的情况
	{
		n -> next = nullptr;
		h ->next = n;
	}
	l->data++;
	cout<< "插入成功!"<<endl;
}

void insertArray(node* l,int* sz,int len)
{
	sort(sz, sz + len);
	l->data = len;
	node* tmp = l;
	for (int i = 0; i < len; i++)
	{
		node* s = new node;
		s->data = sz[i];
		s->next = nullptr;
		tmp->next = s;
		tmp = s;
	}//直接按顺序插入
}

int del(node* l,int x)
{
	node* h = l;
	node* t = l -> next;
	int flag = 0;
	while (t != nullptr)
	{
		if (t->data == x)
		{
			h->next = t->next;
			node* tmp = t;
			free(tmp);//清除占的内存
			t = h->next;
			flag = 1;
			l->data--;
		}
		else
		{
			//h不满足条件就一起动
			h = t;
			t = t->next;
		}
	}
	string res = flag==0?"元素不存在,删除失败":"删除元素成功";
	cout << res << endl;
	return flag;
}

void print(node* l)
{
	cout <<"当前链表长度为" << l -> data <<",数据为 ";
	node* tmp = l->next;
	if(tmp == nullptr)
		cout << "空";
	while (tmp != nullptr)
	{
		cout << tmp->data << " ";
		tmp = tmp->next;
	}
	cout << endl << endl;
}
void destroy(node* l)
{
	node* tmp = l->next;
	//遍历清除
	while (tmp != nullptr)
	{
		node* t = tmp;
		tmp=tmp->next;
		free(t);
		l->data--;
	}
	cout << "链表自动销毁......" << endl;
	cout << "链表销毁成功!" << endl;
}

🍺 exp3.cpp

#include "head.h"
using namespace std;

int main(void)
{
	node* head = new node;
	init(head);//初始化
	cout << "请输入单链表元素个数:" << endl;
	int x = 0;
	cin >> x;
	
	cout << "请输入" << x << "个元素" << endl;
	int sz[1000];
	for (int i = 0; i < x; i++) cin >> sz[i];//填入数据
	insertArray(head, sz,x);
	print(head);
	
	cout << "请输入需要增加的元素" << endl;
	cin >> x;
	insertOne(head,x);
	print(head);
	
	cout << "请输入想要删除的元素" << endl;
	cin >> x;
	del(head, x);//删除
	print(head);
	
	destroy(head);//销毁,但不删头节点
}

仅供参考

更多推荐

13年12月CCF计算机软件能力认证

4、有趣的数时间限制:1.0s内存限制:256.0MB问题描述:问题描述我们把一个数称为有趣的,当且仅当:1.它的数字只包含0,1,2,3,且这四个数字都出现过至少一次。2.所有的0都出现在所有的1之前,而所有的2都出现在所有的3之前。3.最高位数字不为0。因此,符合我们定义的最小的有趣的数是2013。除此以外,4位的

invoke与begininvoke区别

`Invoke`和`BeginInvoke`是用于在多线程应用程序中执行委托的两种不同方法,它们之间的主要区别在于同步和异步执行:1.`Invoke`:-`Invoke`是一个同步方法,它会在当前线程中执行委托。-调用`Invoke`方法会阻塞当前线程,直到委托的执行完成,然后才继续执行后续代码。-这意味着如果在主线程

计算机视觉与深度学习-经典网络解析-VGG-[北邮鲁鹏]

目录标题VGG参考VGG网络贡献使用尺寸更小的$3\times3$卷积串联来获得更大的感受野放弃使用$11\times11$和$5\times5$这样的大尺寸卷积核深度更深、非线性更强,网络的参数也更少;去掉了AlexNet中的局部响应归一化层(LRN)层。网络结构主要改进输入去均值小卷积核串联代替大卷积核无重叠池化卷

TikTok如何打造爆款视频?超店有数让你的视频上热门!

作为TikTok视频博主,你肯定面临着以下难题:播放量卡1000,粉丝数原地踏步。视频创意枯竭,不知道拍什么?不知道拍什么会火?流行趋势慢人一步,热点捉摸不透?一直在模仿,从未有超越。拍摄费时费力,视频制作效率低下...然而!别人家却是这样:粉丝量低的博主也能随随便便播放量破10W+,一条视频带爆粉丝数的翻几番。点赞、

C语言中的sizeof运算符的作用是什么?

在C语言中,sizeof运算符是一个非常重要的运算符,它用于计算数据类型或表达式的大小(以字节为单位)。这个运算符在C语言中的作用非常广泛,它可以帮助程序员确定内存的分配和数据类型的大小,从而更好地管理内存和优化程序性能。在本文中,我们将详细探讨sizeof运算符的作用、用法以及一些示例,以帮助C语言初学者更好地理解它

【计组】计算机系统体系结构

【计组】计算机系统体系结构文章目录【计组】计算机系统体系结构1、体系的发展与思维变化1.1计算机发展1.2冯诺依曼体系2、计算机系统2.1CPU2.2存储层次2.2.1寄存器2.2.2高速缓存(Cache)2.2.3动态随机访问存储器(DRAM)2.2.4硬盘2.3总线2.3.1总线层次2.3.2总线属性1、体系的发展

想要精通算法和SQL的成长之路 - 环形子数组的最大和

想要精通算法和SQL的成长之路-环形子数组的最大和前言一.环形子数组的最大和1.1空间优化前言想要精通算法和SQL的成长之路-系列导航一.环形子数组的最大和原题链接在写这道题目之前,可以先看下这个题:最大子数组和。本题是它的进阶版本,在原本的基础上,有一个环状的数组。那么我们如果将其平铺开来,就是一个两段数组拼接而成。

从源码全面解析 Java SPI 的来龙去脉

👏作者简介:大家好,我是爱敲代码的小黄,独角兽企业的Java开发工程师,CSDN博客专家,阿里云专家博主📕系列专栏:Java设计模式、Spring源码系列、Netty源码系列、Kafka源码系列、JUC源码系列、duubo源码系列🔥如果感觉博主的文章还不错的话,请👍三连支持👍一下博主哦🍂博主正在努力完成20

Spring高手之路12——BeanDefinitionRegistry与BeanDefinition合并解析

文章目录1.什么是BeanDefinitionRegistry?2.为什么需要BeanDefinitionRegistry?3.BeanDefinitionRegistry的使用3.1BeanDefinitionRegistry简单例子3.2有关ImportBeanDefinitionRegistrar的实现类的例子4

sed的不同执行方式

1.命令行执行多条sed命令1.1命令行通过多条-e选项sed-e'command1'-e'command2'-e'command3'匹配root或nobody,或mail:sed-n-e'/^root/p'-e'/^nobody/p'-e'/^mail/p'/etc/passwd1.2用\换行Shell的换行符依然有

音频领域的50个关键词

音频领域的50个关键词前言50个关键词label:音频领域,关键词,领域黑话持续更新中,评论点赞收藏能加快更新的速度……前言本文小结音频领域中高频出现的关键词,便于初入此道的同学有个初略概念。有了这个黑话词典或者研究地图,也能帮助新同学更好地和音频相关领域人员进行交流沟通。单个关键词深入的细节都可以在互联网上搜索到,感

热文推荐