链表的合并,结点逆置,顺序表的高效划分(数据结构作业02)

news2024/12/26 20:49:22

目录

链表的合并

链表的结点逆置

 顺序表的高效划分


链表的合并

        已知两个递增有序的单链表A和B,分别表示两个集合。试设计一个算法,用于求出A与B的交集,并存储在C链表中。例如 : La = {2,4,6,8};Lb = {4,6,8,10};Lc = {4,6,8}。(要求上机实现完整程序代码、核心代码有注释,有运行结果)。 

        算法分析:遍历这两个链表A和B,使用两个指针,创建一个新的空链表C,然后比较当前节点的数据,如果相等,则将该数据添加到链表C中,然后同时移动两个链表的指针。如果不相等,则移动较小值所在链表的指针。这样可以确保只添加两个链表中共有的元素到链表C中。 

#include <stdio.h>
#include <malloc.h>
typedef int ElemType;
typedef struct LNode  
{
	ElemType data;
	struct LNode *next;		//指向后继结点
} LinkNode;		

//创建单链表,头插法
LinkNode * createlist(int a[],int len) {
	//len是链表的长度
	LinkNode * L;
	LinkNode * s;
	L = (LinkNode *)malloc(sizeof(LinkNode));
	L -> next = NULL;//创建头结点,next指向为空
	for(int i = 0; i < len; i++) {
		s = (LinkNode*)malloc(sizeof(LinkNode));//创建结点s
		s -> data = a[i];
		s -> next = L -> next; //将s插入原首节点前,头结点后
		L -> next = s;
	}
	return L;
}

//用于打印链表
//由于存储链表使用的是头插法,所以打印时我们现将链表存入一个数组
//再将那个数组反向输出就是我们需要的样子
void printlist(LinkNode *L) {
	LinkNode *p = L -> next;//让p指向首结点
	int arr[4];
	int len = 0,i = 0;
	while(p != NULL) {
		arr[i] = p -> data;
		p = p -> next;
		i++,len++;
		//只要没到尾结点就一直存入arr数组
	}
	len = len - 1;//最后多加了一次len所以要减去
	for(int i = len; i >= 0; i--) {
		printf("%d ",arr[i]);
	}
	printf("\n");
}

//求两个链表的交集
LinkNode * intersection(LinkNode *a,LinkNode *b) {
	//传入a,b两个链表
	LinkNode *c;
	c = (LinkNode *)malloc(sizeof(LinkNode));
	LinkNode *r = c;
	//创建链表c的头结点,使用尾插法
	a = a -> next,b = b -> next;
	//让链表a和链表b指向它们的首结点
	LinkNode *p;
	while(a != NULL && b != NULL) {
		if(a -> data == b -> data) {
			//若二值相等,使用尾插法存入c中,并且让这两个指针都往后移动
			p = (LinkNode *)malloc(sizeof(LinkNode));
			p -> data = a -> data;
			r -> next = p;
			r = r -> next;
			
			a = a -> next,b = b -> next;
		}
		else {
			//由于创建列表时使用了尾插法,所以要变得相反
			//若二值不相等则值更大的往后移一格
			if(a -> data > b -> data)
				a = a -> next;
			if(b -> next > a -> next)
				b = b -> next;
		}
	}
	r -> next = NULL;
	//尾插法注意要让尾结点的next域置为空
	return c;
}

int main() {
	//创建链表a
	int a[4];
	a[0] = 2,a[1] = 4,a[2] = 6,a[3] = 8;
	LinkNode *la;
	la = createlist(a,4);
	printf("链表a为:");
	printlist(la);
	
	//创建链表b
	int b[4];
	b[0] = 4,b[1] = 6,b[2] = 8,b[3] = 10;
	LinkNode *lb;
	lb = createlist(b,4);
	printf("链表b为:");
	printlist(lb);
	
	//得到链表la和lb的交集lc
	LinkNode *lc = intersection(la,lb);
	printf("链表a和链表b的交集链表c为:");
	printlist(lc);
}

 

链表的结点逆置

        假设有一个带头结点的单链表L=(2,4,6…,20)。设计一个算法将所有结点逆置,即:L=(20,18,…,2)。(要求要求上机实现完整程序代码、核心代码有注释,有运行结果) 

        算法分析:可以使用尾插法建立第一个链表,再写一个逆置函数,传入这个链表,在函数里面改变当前节点的指针使其指向其前一个节点,以此类推,直到遍历完所有的节点。 

#include <stdio.h>
#include <malloc.h>
typedef int ElemType;
typedef struct LNode  
{
	ElemType data;
	struct LNode *next;		//指向后继结点
} LinkNode;		

//创建单链表,尾插法
LinkNode * createlist(int a[],int len) {
	LinkNode *L,*r,*s;
	L = (LinkNode*)malloc(sizeof(LinkNode));
	//L为头结点
	r = L;
	for(int i = 0; i < len; i++) {
		s = (LinkNode *)malloc(sizeof(LinkNode));
		s -> data = a[i];
		r -> next = s;
		r = r -> next;
		//将数据存入s中并且让r的next指向它
		//再将r向后移动一格
	}
	r -> next = NULL;
	//记得要让尾结点的next域为空
	return L;
}

//打印单链表
void printlist(LinkNode * l) {
	l = l -> next;
	//让l指向它的首结点
	while(l != NULL) {
		printf("%d ",l -> data);
		l = l -> next;
	}
	printf("\n");
}

//打印逆置后的单链表
void printreverselist(LinkNode *l) {
	//采用这种逆置方法后不用指向首结点,此时l即为首结点
	while(l != NULL) {
		printf("%d ",l -> data);
		l = l -> next;
	}
	printf("\n");
}

//逆置链表函数
LinkNode * reverselist(LinkNode * head) {
	//创建新的头结点p
	LinkNode *p;
	
	LinkNode *l,*r;
	l = head -> next;
	//l表示left,是左边的指针
	//r表示right,是右边的指针
	//让s指向首结点,头结点的next指向空
	head -> next = NULL;
	
	//核心代码
	while(l != NULL) {
		r = l -> next;//保存当前节点的下一个节点
		l -> next = p;//将当前节点的next指向前一个节点
		p = l;//更新p为当前节点
		l = r;//移动到下一个节点
	}
	return p;
}

int main() {
	//创建逆置前的链表
	int a[100];
	int n = 1;
	for(int i = 0; i < 10; i++) {
		a[i] = 2 * n;
		n++;
	}
	LinkNode *l = createlist(a,10);
	printf("逆置前的链表为:");
	printlist(l);
	
	//逆置链表
	l = reverselist(l);
	printf("逆置后的链表为:");
	printreverselist(l);
}

 

 顺序表的高效划分

        对有n个整形元素的顺序表以第一个元素为基准进行高效划分,将所有大于该基准的所有元素放在该基准的右边;将所有小于等于该基准的所有元素放在该基准的左边。例如对于线性表(17,2,3,5,4,20,1,18,19,20,21,6,22)要求要求上机实现完整程序代码、核心代码有注释,有运行结果)

#include <stdio.h>
#include <malloc.h>
#define MaxSize 50
typedef int ElemType; 
typedef struct 
{	int data[MaxSize];		//存放顺序表元素
	int length;					//存放顺序表的长度
} SqList;						//顺序表的类型

//建立顺序表
SqList * createlist(int a[],int len) {
	SqList *l;
	l = (SqList *)malloc(sizeof(SqList));
	int k = 0;
	//k用于记录顺序表的长度
	for(int i = 0; i < len; i++) {
		l -> data[i] = a[i];
		k++;
	}
	l -> length = k;
	return l;
}

void partitionlist(SqList * list) {
	int l = 0,r = list -> length - 1;
	//让l指向头,r指向尾
	
	int base = list -> data[0];
	//将第一个数设置为基准
	
	while(l < r) {
		while(r > l && list -> data[r] > base)
			r--;
		//先从右往左遍历,找到第一个小于等于base的数
		list -> data[l] = list -> data[r];
		//将这个数放入l的位置上
		
		while(l < r && list -> data[l] <= base)
			l++;
		//再从左往右,找到第一个大于base的数
		list -> data[r] = list -> data[l];
		//将这个数放在r的位置上
	}
	list -> data[l] = base;
	//最后把这个数放在位置l处
}

//打印顺序表
void printlist(SqList *l) {
	for(int i = 0; i < l -> length; i++) {
		printf("%d ",l -> data[i]);
	}
	printf("\n");
}

int main() {
	//创建顺序表
	int arr[100];
	arr[0] = 17;arr[1] = 2;arr[2] = 3;arr[3] = 5;arr[4] = 4;
	arr[5] = 20;arr[6] = 1;arr[7] = 18;arr[8] = 19;arr[9] = 20;
	arr[10] = 21;arr[11] = 6;arr[12] = 22;
	SqList *l;
	l = createlist(arr,13);
	printf("初始的顺序表为:");
	printlist(l);
	
	//进行高效划分
	partitionlist(l);
	printf("高效划分后的顺序表为:");
	printlist(l);
	
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

闯关leetcode——28. Find the Index of the First Occurrence in a String

大纲 题目地址内容 解题代码地址 题目 地址 https://leetcode.com/problems/find-the-index-of-the-first-occurrence-in-a-string/description/ 内容 Given two strings needle and haystack, return the index of the first occurrence of needle in haystack, or -1 if …

冒泡排序的C++语言实现(不用std::sort)

自己写一个冒泡排序的代码。 void vSort(std::vector<int> & vec, bool bDescending) {//冒泡排序int iTail vec.size()-1;while(iTail > 0){for(int k 0; k < iTail; k){int f1 vec.at(k);int f2 vec.at(k1);if(f1 < f2){//默认是降序int iTmp vec.a…

为什么大公司不用pandas取代excel?

如果你熟练使用Excel的话&#xff0c;你就会发现有些pandas的功能&#xff0c;在Excel中也可以实现&#xff0c;而且对比下来&#xff0c;Excel操作更简单&#xff0c;从效率上跟pandas更无二致&#xff0c;这样Excel的优势就比较突出了&#xff0c;比如下面使用pandas和Excel分…

【实战篇】幻读是什么,幻读有什么问题?

背景 我们先使用一个小一点儿的表。建表和初始化语句如下&#xff1a; CREATE TABLE t (id int(11) NOT NULL,c int(11) DEFAULT NULL,d int(11) DEFAULT NULL,PRIMARY KEY (id),KEY c (c) ) ENGINEInnoDB; insert into t values(0,0,0),(5,5,5), (10,10,10),(15,15,15),(20,…

2010-2022 CSP-J/普及组T1-T4考点统计

T1考点统计 T2考点统计 T3考点统计 T4考点统计 总结

MOE论文汇总2

TASK-CUSTOMIZED MASKED AUTOENCODER VIA MIXTURE OF CLUSTER-CONDITIONAL Experts 这篇论文提出了一种新颖的自监督学习方法&#xff0c;名为“Mixture of Cluster-conditional Experts (MoCE)”&#xff0c;旨在解决传统Masked Autoencoder (MAE)在不同下游任务中可能遇到的负…

蓝桥杯-STM32G431RBT6(UART解析字符串sscanf和解决串口BUG)

一、C语言常识 printf和sprintf的主要区别在于它们的功能和用途&#xff1a; printf&#xff1a;主要用于将格式化的数据输出到标准输出&#xff08;如屏幕&#xff09;。sprintf&#xff1a;则是将格式化的数据存储到一个指定的字符串缓冲区中&#xff0c;而不是直接输出。 pr…

Docker实操:安装MySQL5.7详解(保姆级教程)

介绍 Docker 中文网址: https://www.dockerdocs.cn Docker Hub官方网址&#xff1a;https://hub.docker.com Docker Hub中MySQL介绍&#xff1a;https://hub.docker.com/_/mysql ​ 切换到“Tags”页面&#xff0c;复制指定的MySQL版本拉取命令&#xff0c;例如 &#xff1a…

LabVIEW提高开发效率技巧----使用LabVIEW工具

LabVIEW为开发者提供了多种工具和功能&#xff0c;不仅提高工作效率&#xff0c;还能确保项目的质量和可维护性。以下详细介绍几种关键工具&#xff0c;并结合实际案例说明它们的应用。 1. VI Analyzer&#xff1a;自动检查代码质量 VI Analyzer 是LabVIEW提供的一款强大的工…

架构师,被严重低估的角色!

在企业数字化转型与变革的壮阔浪潮中&#xff0c;企业架构&#xff08;Enterprise Architecture&#xff0c;EA&#xff09;作为一门高度复杂且跨学科的知识体系&#xff0c;无可争议地成为了驱动组织战略深化与技术创新的核心引擎。尽管市场上充斥着丰富的指导理论与参考资料&…

202409012在飞凌的OK3588-C的核心板上使用Rockchip原厂的Buildroot点MIPI屏【背光篇】

202409012在飞凌的OK3588-C的核心板上使用Rockchip原厂的Buildroot点MIPI屏【背光篇】 2024/9/12 10:44 缘起&#xff0c;拿到一块MIPI屏&#xff0c;需要使用飞凌的OK3588-C的核心板在Android12下点亮。 在飞凌的Linux R4下修改部分屏参之后即可直接点亮。 但是在飞凌的Andro…

Java笔记-MinIO Java SDK的使用

此博文内容为&#xff1a; 使用SDK创建bucket&#xff1b; 使用SDK上传文件&#xff1b; 使用SDK下载文件。 maven添加&#xff1a; <dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.5.2</versi…

Linux使用Clash,clash-for-linux

文件下载 clash-for-linuxhttps://link.zhihu.com/?targethttps%3A//zywang.lanzn.com/ijE2a1m7h6mb&#xff08;百度和阿里云盘都不支持这个文件分享&#xff09;。 使用须知 - 此项目不提供任何订阅信息&#xff0c;请自行准备Clash订阅地址。 - 运行前请手动更改.env文件…

嵌入式开发—CAN通信协议详解与应用(中)

书接上回&#xff1a;嵌入式开发—CAN通信协议详解与应用&#xff08;上&#xff09; 文章目录 CAN通讯中的位时间和位同步位时间的构成采样点 位时间的计算公式时间量子&#xff08;Time Quantum, TQ&#xff09;位时间的阶段示意图位同步机制 CAN通信中的仲裁规则仲裁规则的…

03-Mac系统PyCharm主题设置

目录 1. 打开PyCharm窗口 2. Mac左上角点击PyCharm&#xff0c;点击Settings 3. 点击第一项Appearance& Behavior 4. 点击Appearance 5. 找到Theme进行设置 1. 打开PyCharm窗口 2. Mac左上角点击PyCharm&#xff0c;点击Settings 3. 点击第一项Appearance& Behavi…

【例题】lanqiao4425 咖啡馆订单系统

样例输入 3 2 2 1 3 1 2样例输出 3 2样例说明 输入的数组为&#xff1a;【3&#xff0c;1&#xff0c;2】 增量序列为&#xff1a;【2&#xff0c;1】 当增量 h2&#xff1a;对于每一个索引 i&#xff0c;我们会将数组元素 arr[i] 与 arr[i−h] 进行比较&#xff0c;并进行可…

Stable Diffusion绘画 | ControlNet应用-IP-Adapter:堪比 Midjourney 垫图

IP-Adapter 是腾讯AI实验室研发的控制器&#xff0c;属于 ControlNet 最强控制器前三之一。 如果想参照图片的风格&#xff0c;生成各种各样类似效果的图片&#xff0c;就可以用到 IP-Adapter。 在 ControlNet 单元中上传一张图片&#xff1a; 不输入任何提示词&#xff0c;出图…

MySQL数据库:掌握备份与恢复的艺术,确保数据安全无忧

作者简介&#xff1a;我是团团儿&#xff0c;是一名专注于云计算领域的专业创作者&#xff0c;感谢大家的关注 座右铭&#xff1a; 云端筑梦&#xff0c;数据为翼&#xff0c;探索无限可能&#xff0c;引领云计算新纪元 个人主页&#xff1a;团儿.-CSDN博客 目录 前言&#…

波导阵列天线学习笔记 馈电网络1 使用X型全公共波导馈网的毫米波大规模天线阵列的带宽提升

摘要&#xff1a; 全公共波导馈网的一次反射等效模型被研究用于提出一种毫米波大规模天线阵列带宽提升的新方法。理论分析显示由馈电网络拓扑造成的指定频率的多级小反射的同相叠加现象是影响大规模阵列的可实现带宽的重要因素&#xff0c;除了包含阵列的独立功分器和反射器的带…

【Hot100】LeetCode—295. 数据流的中位数

目录 1- 思路题目识别堆实现 2- 实现⭐4. 寻找两个正序数组的中位数——题解思路 3- ACM 实现 原题链接&#xff1a;295. 数据流的中位数 1- 思路 题目识别 识别1 &#xff1a;实现一个数据结构&#xff0c;求中位数 堆实现 思路 利用优先队列&#xff0c;小根堆放较小的元…