C++链表的建立,排序,删除

2023-11-02

描述:使用随机数建立链表节点,节点的结构很简单,就是一个整形数(随机数)和一个指针,有三个函数,第一个函数建立链表,第二个函数对链表进行排序,第三个函数将链表中所有有重复数字的节点删除,只留只出现过一次的节点。

输入:链表的节点数

输出:

1.建立的链表

2.排序后的链表

3.删除后的链表

#include<iostream>
#include<stdlib.h>
#include<time.h>
#define random(x) (rand()%x)
using namespace std;
struct numst//定义结构体变量
{
	int num;
	numst *next;
};
numst *head=NULL;//定义头指针,并置空
numst *creat()//定义函数。用来创建范围为0~9的链表,由用户设定链表节点个数
{
	numst *p=NULL;
	numst *q=NULL;//定义两个结构体指针变量,用来作为循环迭代中间量
	int sum;
	cout<<"input the sum of nodes:";
	cin>>sum;//由用户输入节点个数
	while(sum)//while循环num次,产生num个链表节点
	{
		p=new numst;
		p->num=random(10);//将产生的随机数赋给新产生的结构体中的变量
		if(head==NULL)//如果头指针为空,则把第一个节点设为头节点
			head=p;
		else
			q->next=p;//否则将p指向q的下一个节点
		q=p;//另q保持为最末尾的节点
		sum--;
	}
	if(head!=NULL)
		q->next=NULL;//将最后一个节点的指针指向空
	numst *begin=head;
	while(begin!=NULL)
	{
		cout<<begin->num<<" ";
		begin=begin->next;
	}//输出生成的链表
	cout<<endl;
	return(head);//函数返回头指针

}
numst *seq(numst *head)//定义函数将随机数链表进行排序
{
	int sum=0,mid;//定义节点总数num,和冒泡法排序的中间量mid
	numst *temp=head;//定义节点数统计指针
	numst * m=head;
	numst * n;//定义冒泡法指针
	while(temp!=NULL)
	{
		sum++;
		temp=temp->next;
	}//统计节点数
	for(int i=0;i<sum;i++)
	{
		n=m->next;//总是保持n指向m的下一个节点
		for(int j=i+1;j<sum;j++)
		{
			if(m->num>n->num)
			{
				mid=m->num;
				m->num=n->num;
				n->num=mid;
			}
			n=n->next;//让m和m以后的所有节点比较

		}
		m=m->next;//m指向下一个节点
	}

		numst *begin=head;
	while(begin!=NULL)
	{
		cout<<begin->num<<" ";
		begin=begin->next;
	}
	cout<<endl;//输出排序后的指针

	return (head);
}
 numst *deletes(numst *head)//定义函数将所有的有数字重复的节点删除
{
	numst *a=head;//定义外层循环的指针a,b是连续的两个指针b在a的后面,每次循环,
	numst *b=a->next;//b就和a比较,如果相同,则将值赋给mark,进行内层循环的删除工作;
	numst *start=head;//定义内层循环的指针,former总是指向start的前一个节点;
	numst *former=NULL;
	int mark;//标记相等的节点的值
	while(b!=NULL)//外层循环,此处不能设为b->next!=NULL,因为会导致最后两个相等的节点不能删除,
	{				//因为最后一个节点的指针指向NULL,所以导致最后这个节点的循环被跳过
		
		if(b->num==a->num)
		{
			mark=a->num;
			while(start!=NULL)
			{
				if((start==head)&&(start->num==mark))//情况一:要删除的是头节点
				{
					if(start->next==NULL)
					{
						cout<<"all deleted"<<endl;
						return(NULL);//如果所有的节点都被删除,则返回NULL;
					}
					head=start->next;//head指向头节点的下一个
					delete start;//删除头节点
					a=head;//由于头节点被删除所以有可能外层循环的a,b指向的节点已被删除,
					b=a->next;//所以重新将a指向头节点
					start=head;//对比的起始点也重置为头节点
				}
				else if(start->num==mark)//第二种情况:不是头节点
				{
					former->next=start->next;
					delete start;//如果符合情况,则删除本节点
					start=former->next;//将start重新指向former的下一个节点
					b=former;//更新b,将外层循环的b设为former,说明外层循环从former开始,以免b的指向丢失
				}
				else//第三种情况:节点不等于mark,则向前推进
				{
					former=start;
					start=start->next;
				}
				
			}
			start=head;//为了测试下一个mark,必须将对比的起始点在此重置为头节点
		}
		else
		{
		a=b;
		b=b->next;//如果不是头节点,继续向后推进,寻找相同节点
		}
	}
	numst *begin=head;
	while(begin!=NULL)
	{
		cout<<begin->num<<" ";
		begin=begin->next;
	}
	cout<<endl;//输出删除后的链表
}
int main()
{
	srand((int)time(0));//设置随机数种子
	deletes(seq(creat()));//调用函数
	return 0;
}


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

C++链表的建立,排序,删除 的相关文章

  • Windows 上使用 g++ 的 Makefile,链接库

    我已经厌倦了 MSVC 6 以及每个人总是告诉我它是一个蹩脚的编译器等等 所以现在我决定尝试使用 vim 加 g 和 makefile 这是我的问题 我有以下 makefile This is supposed to be a commen
  • MVC 重定向到没有控制器的视图

    希望应该是一个简单的 我创建了一个通用错误视图 当整个站点的操作方法内发生异常时 我想显示该视图 我创建了一个部分页面 所有导航都位于其中 因此我不需要在此视图上使用控制器 那么如何从控制器内的操作方法重定向到它 像这样的东西 HttpPo
  • 扫描文本文件时如何跳过行?

    我想扫描一个文件并在阅读之前跳过一行文本 我试过 fscanf pointer n struct test i j 但这个语法只是从第一行开始 我可以使用 scanf 使用以下指令跳过行 fscanf config file n n 格式字
  • C修改printf()输出到文件

    有没有办法修改printf为了将字符串输出到文件而不是控制台 我尝试在互联网上查找一些内容 发现了类似的电话dup dup2 and fflush这可能与此有关 EDIT 也许我不清楚 问题是这是C考试问题 问题如下 解释一个通常将字符串输
  • 为什么opencv videowriter这么慢?

    你好 stackoverflow 社区 我有一个棘手的问题 我需要你的帮助来了解这里发生了什么 我的程序从视频采集卡 Blackmagic 捕获帧 到目前为止 它工作得很好 同时我用 opencv cv imshow 显示捕获的图像 它也工
  • 通过引用传递时取消引用指针

    当通过引用传递给函数时取消引用指针时会发生什么 这是一个简单的例子 int returnSame int example return example int main int inum 3 int pinum inum std cout
  • 为什么假设 send 可能返回的数据少于在阻塞套接字上传输的请求数据?

    在流套接字上发送数据的标准方法始终是调用 send 并写入一大块数据 检查返回值以查看是否发送了所有数据 然后再次调用 send 直到整个消息被接受 例如 这是一个常见方案的简单示例 int send all int sock unsign
  • 如何在 Windows 窗体中运行屏幕保护程序作为其背景?

    如何在 Windows 窗体中运行屏幕保护程序作为其背景 用户还可以在屏幕保护程序运行时与表单控件进行交互 为什么这个 我们有一个案例 需要在用户时运行 Windows Bubbles 屏幕保护程序 可以继续与表单控件交互吗 您可以使用以下
  • 将 C# 反射代码移植到 Metro-Ui

    我正在尝试移植使用反射的现有 C 类 通用工厂 但我无法编译这段代码 Type types Assembly GetAssembly typeof TProduct GetTypes foreach Type type in types i
  • 使用反射获取基类的受保护属性值

    I would like to know if it is possible to access the value of the ConfigurationId property which is located in the base
  • 使用 openssl 检查服务器安全协议

    我有一个框架应用程序 它根据使用方式连接到不同的服务器 对于 https 连接 使用 openssl 我的问题是 我需要知道我连接的服务器是否使用 SSL 还是 TLS 以便我可以创建正确的 SSL 上下文 目前 如果我使用错误的上下文尝试
  • 导出到 CSV 时 Gridview 出现空行

    这个问题是由进一步讨论引发的这个问题 https stackoverflow com questions 6674555 export gridview data into csv file 6674589 noredirect 1 com
  • 如何使用泛型类型的 DataContractSerializer 编写自定义序列化器?

    我想编写一个自定义序列化器 用于将会话状态存储到Azure 缓存 预览版 这意味着这个自定义序列化器必须实现IDataCacheObjectSerializer 如果我错了 请告诉我 我需要编写这个自定义序列化程序的原因是我需要序列化一些包
  • 为什么重载方法在 ref 仅符合 CLS 方面有所不同

    公共语言规范对方法重载非常严格 仅允许根据其参数的数量和类型来重载方法 如果是泛型方法 则根据其泛型参数的数量进行重载 根据 csc 为什么此代码符合 CLS 无 CS3006 警告 using System assembly CLSCom
  • 如何不在类中实现接口的功能?

    面试时面试官问了我以下问题 但我不知道这个问题的答案是什么 请帮忙 如果我不想 我必须做什么 在我的类中实现一个函数 在接口中声明为 由我班实施 Edited 我正在使用 NET 和 C 如果有人可以提供 C 示例代码示例 那就太好了 Th
  • 在 .NET 中记录 StackOverflowException

    最近 我的 NET 应用程序 asp net 网站 中出现了堆栈溢出异常 我之所以知道该异常是因为它出现在我的 EventLog 中 我知道 StackOverflow 异常无法被捕获或处理 但是有没有办法在它杀死您的应用程序之前记录它 我
  • 有没有更好的方法来获取每个项目与谓词匹配的子序列?

    假设我有一个 IEnumerable 例如 2 1 42 0 9 6 5 3 8 我需要获得与谓词匹配的项目的 运行 例如 如果我的谓词是 bool isSmallerThanSix int number 我想得到以下输出 2 1 0 5
  • 为什么C语言中可以使用多个分号?

    在 C 中我可以执行以下操作 int main printf HELLO WORLD 它有效 这是为什么 我个人的想法 分号是一个 NO OPERATION 来自维基百科 指示符 拥有一大串分号与拥有一个分号并告诉 C 语句已结束具有相同的
  • c# 替代方案中 cfusion_encrypt 中填充的密钥是什么?

    我找到了从这里复制 C 中的 cfusion encrypt 函数的答案 ColdFusion cfusion encrypt 和 cfusion decrypt C 替代方案 https stackoverflow com questio
  • 使用剪贴板 SetText 换行

    如何使用 SetText 方法添加换行符 I tried Clipboard SetText eee n xxxx 但当我将剪贴板数据粘贴到记事本中时 它没有给我预期的结果 预期结果 eee xxxx 我怎样才能做到这一点 Windows

随机推荐

  • Vmware16 下载与安装

    Vmware16 下载与安装 vmware16 密钥 ZF3R0 FHED2 M80TY 8QYGC NPKYF YF390 0HF8P M81RQ 2DXQE M2UT6 ZF71R DMX85 08DQY 8YMNC PPHV8 Vmw
  • tshark解析本地pcap数据包提取五元组{src_ip,src_port,proto,dst_ip,dst_port}与时间戳,包长

    tshark官方文档 https www wireshark org docs man pages tshark html wireshark官方特征参考 https www wireshark org docs dfref 前提需要安装w
  • 利用递归求斐波那契数列

    斐波那契额是二级递推数列 从第三项起 每项为前两项的和 利用函数的递归可以很好实现 只需每次返回n 1 和 n 2 即可 上代码 define CRT SECURE NO WARNINGS 1 include
  • C#使用多线程并发之异步委托

    阻塞式编程 我们一边编写的代码都是同步代码 也就是从上到下按照顺序执行 例如 public delegate void DoWorkHandler class Program static void Main string args Con
  • vsflexgrid单元格换行后自动使用行高_大咖分享办公秘籍:Word和Excel换行

    我们在日常办公和学习中 对文档进行整理和粘贴数据的过程中 经常会用到的就是换行功能了 那么怎么实现自动换行呢 下面 就由非凡学院商务办公培训专业的付老师 和大家分享一下在Word和Excel中简单的实现过程 赶紧来看看和学习一下吧 1 硬回
  • 虚拟机网络配置、防火墙、克隆

    一 修改虚拟机的网络配置 在虚拟机开启的情况下配置 选中虚拟机hadoop100 编辑 虚拟网络编辑器 更改设置 NAT模式 NAT设置 网关改为192 168 1 2 连点两次确定 二 修改windows的网络配置 1 点击电脑右下角的网
  • 华为OD机试 - 靠谱的车 - 逻辑分析(Java 2023 B卷 100分)

    目录 专栏导读 一 题目描述 二 输入描述 三 输出描述 四 解题思路 五 Java算法源码 六 效果展示 1 输入 2 输出 3 说明 华为OD机试 2023B卷题库疯狂收录中 刷题点这里 专栏导读 本专栏收录于 华为OD机试 JAVA
  • DBeaver报Public Key Retrieval is not allowed 错误

    解决方法 1 选择报错的链接 按F4 出现编辑链接弹窗 切换到驱动属性标签页 2 修改allowPublicKeyRetrieval属性的值为TRUE 3 重启DBeaber
  • Git+TortoiseGit详细安装教程(HTTP方式)

    Git是核心 TortoiseGit是个外壳 git需要使用命令行 可以简单理解为TortoiseGit是git的GUI展现形式 使用TortoiseGit操作 就不用记住git命令了 Git可以使用HTTP和SSH方式 HTTP方式配置更
  • 素数筛

    素数又称质数 是指除了1和它本身 再也没有其他的因子 合数是除了1和它本身以外 还有其他的因子 1既不是素数也不是合数 此题为洛谷上的一道题 以此题为例题 讲解素数筛 埃氏筛法 时间复杂度O nlogn 得分 80 include
  • html比较字符数字大小,JavaScript怎么比较字符串?

    javascript怎么比较字符串 下面本篇文章就来给大家介绍使用javascript比较字符串的几种方法 希望对大家有所帮助 一 大于 gt 小于 javascript字符串在进行大于 小于 比较时 会根据第一个不同的字符的ascii值码
  • 预训练模型、迁移学习

    预训练模型把迁移学习很好地用起来了 让我们感到眼前一亮 这和小孩子读书一样 一开始语文 数学 化学都学 读书 网上游戏等 在脑子里积攒了很多 当他学习计算机时 实际上把他以前学到的所有知识都带进去了 如果他以前没上过中学 没上过小学 突然学
  • linux 查看文件个数

    要查看 Linux 系统中某个目录下的文件数量 可以使用 ls 命令结合管道和 wc 命令来完成 具体来说 可以使用 ls 命令的 l 参数来列出目录中的文件和子目录的详细信息 然后将输出结果通过管道 传递给 wc 命令 使用 l 参数来统
  • sort()函数与qsort()函数及其头文件

    sort 函数是C 中的排序函数其头文件为 include
  • vscode路径别名文件跳转解决办法

    第一步 下载 1 在jsconfig json中配置 compilerOptions target es5 module esnext baseUrl moduleResolution node paths src lib esnext d
  • Code Llama: Open Foundation Models for Code

    Paper name Code Llama Open Foundation Models for Code Paper Reading Note Paper URL https ai meta com research publicatio
  • SpringBoot + mybatis + mysql8.0.11 构建项目

    前几天在阐释使用mysql8 0 11 刚解决第三方工具链接没数据库的问题 然后兴高采烈的去搭建项目 进行使用 然后又是一种一种的问题冒出 具体出现的问题 以及相关的解决方式如下 主要是在建立链接的时候一些配置参数的问题 本人使用的是Int
  • 都2023年了,为什么大家还都在吹捧 Python?

    2023 年 Python 还可学吗 答案当然是可 近些年间 Python 的火热有目共睹 作为一种功能强大的高级编程语言 在 2018 年的时候它的流行程度就得到了大幅提高 图源 Stack Overflow 网站编程语言浏览量统计数字
  • PyTorch教程—B站刘二大人笔记

    PyTorch教程 B站刘二大人笔记 PyTorch代码笔记 1 linear py 2 gradient py 3 back py 4 pytorch py 5 logistic py 6 multiple py 7 data py 8
  • C++链表的建立,排序,删除

    描述 使用随机数建立链表节点 节点的结构很简单 就是一个整形数 随机数 和一个指针 有三个函数 第一个函数建立链表 第二个函数对链表进行排序 第三个函数将链表中所有有重复数字的节点删除 只留只出现过一次的节点 输入 链表的节点数 输出 1