首页 > 其他分享 >数据结构+单链表应用

数据结构+单链表应用

时间:2024-08-16 11:51:29浏览次数:13  
标签:p2 结点 p1 next 单链 应用 L1 数据结构 LinkNode

一、问题描述

编写程序实现两个有序表的交和差,令 L1=(x1, x2, x3, ..., xn),L2=(y1, y2, y3, ..., yn),它们是两个线性表,采用带头结 点的单链表存储,请先实现单链表存储两个链表,再完成如下功能: (1)sort:将单链表的所有结点按照数据域进行递增排序,构 造成有序单链表; (2)interSect:求两个有序单链表的交集,即C = A B,C 中 包含两个集合中重复出现的所有元素; (3)subs:求两个有序单链表的差集,即,C = A− BC 中包含所 有属于 A 但不属于 B 的元素。

二、问题解决

#include <stdio.h> 
#include <cstdlib> 
typedef int ElemType; 
typedef struct LNode 
 { 
 ElemType data; 
 struct LNode *next; 
 }LinkNode; 
 
void CreateList(LinkNode *&L,ElemType a[],int n) 
 { 
 LinkNode *s,*r; 
 L=(LinkNode *)malloc(sizeof(LinkNode)); 
 r=L; 
 for(int i=0;i<n;i++) 
 { 
 s=(LinkNode *)malloc(sizeof(LinkNode)); 
 s->data=a[i]; 
 r->next=s; 
 r=s; 
 } 
 r->next=NULL; 
 } 
 
LinkNode *InitList() 
 { 
 LinkNode *L=(LinkNode *)malloc(sizeof(LinkNode)); 
 L->next=NULL; 
 return L; 
 } 
 void DestroyList(LinkNode **L) 
{ 
 LinkNode *pre=*L,*p=(*L)->next; 
 while(p!=NULL) 
 { free(pre); 
 pre=p; 
 p=pre->next; 
 } 
 free(pre); 
 *L=NULL; 
} 
 
void DispList(LinkNode *L) 
 { 
 LinkNode *p=L->next; 
 while(p!=NULL) 
 { 
 printf("%d",p->data); 
 p=p->next; 
 } 
 printf("\n"); 
 } 
 
void sort(LinkNode *L) 
{ 
 LinkNode *p,*pre,*q; 
 p=L->next->next; 
 L->next->next=NULL; 
 while(p!=NULL) 
 { 
 q=p->next; //q 保持结点后继
结点的指针 
 pre=L; 
 while(pre->next!=NULL&&pre->next->data<p->data) 
 pre=pre->next; 
 p->next=pre->next; 
 pre->next=p; 
 p=q; //扫描单链表余下结
点 
 } printf("递增排序结果为:"); 
 
} 
 
void InterSect(LinkNode *L1, LinkNode *L2, LinkNode *L3) 
{ 
 LNode *p1, *p2, *p3; //生成三个 LNode 类型的指针
p1, p2 ,p3 
 p1 = L1->next; //p1 指向 L1 的首元结点 
 p2 = L2->next; //p2 指向 L2 的首元结点 
 p3 = L3; //p3 指向 L3 的头结点 (p3 用
来存放交集部分) 
 p3->next = NULL; //p3 的 next 域置空, 当前还
没有存放数据 
 while (p1&& p2) 
 { 
 if (p1->data < p2->data) //两个链表当前结点的数据域进
行比较,数据小的结点,就继续向后移动,指向下一个结点 
 { 
 p1 = p1->next; 
 } 
 else if (p1->data > p2->data) 
 { 
 p2 = p2->next; 
 } 
 else 
 { //两个结点的数据域相同时 
 p3->next = p2; //就将 p3 结点的 next 域指向 p2 
 p1 = p1->next; //p1,p2 结点指向下一结点 
 p2 = p2->next; 
 p3 = p3->next; //p3 指向下一结点 
 } 
 } 
 printf("链表交集为:"); 
} 
 
void Subs(LinkNode *L1, LinkNode *L2) 
{ 
 LinkNode *p1, *p2 ,*pre; 
 p1 = L1->next;  p2 = L2->next; 
 pre= L1; 
 while (p1!= NULL&&p2!= NULL) 
 { 
 if (p1->data < p2->data) 
 { 
 pre=p1; 
 p1 = p1->next; 
 } 
 else if (p1->data > p2->data) 
 { 
 p2=p2->next; 
 } 
 else if(p1->data == p2->data) 
 { 
 pre->next = p1->next;//若 p1 和 p2 指向的数据域的
值相同则删去 L1 中该数据 
 p1=p1->next; 
 p2=p2->next; 
 } 
 } 
 
 printf("链表差集为:"); 
 } 
 
 
int main() 
{ 
 int a[]={5,2,1,6,8,9}; 
 int b[]={3,9,5,6,7,4}; 
 LNode *L1=(LNode*)malloc(sizeof(LNode)); 
 int n=sizeof(a)/sizeof(a[0]); 
 CreateList(L1,a,n); 
 printf("L1 原链表为:"); 
 DispList(L1); 
 sort(L1); 
 DispList(L1); 
 LNode *L2=(LNode*)malloc(sizeof(LNode)); 
 int m=sizeof(b)/sizeof(b[0]); 
 CreateList(L2,b,m);  printf("L2 原链表为:"); 
 DispList(L2); 
 sort(L2); 
 DispList(L2); 
 LNode *L3=(LNode*)malloc(sizeof(LNode)); 
 InterSect(L1,L2,L3); 
 DispList(L3); 
 Subs(L1,L2); 
 DispList(L1); 
 return 0; 
} 

三、代码分析

1、将单链表的所有结点按照数据域进行递增排序,只需要将遍历 一遍链表,判断前一个结点的数据域的值是否大于后继结点的 数据域的值,是则交换两结点。

2、 两个有序单链表的交集,设置三个指针 p1、p2、p3 开始时分 别指向 L1、L2、L3 的开始结点。循环进行以下判断和操作: 如果 p1 所指结点的值小于 p2 所指结点的值,则 p 后移一 位; 如果 p2 所指结点的值小于 p1 所指结点的值,则 q 后移一位; 如果两者所指结点的值相同,则将 p1 或 p2 所指结点的值放在 L3 中,同时 p3 后移一位。 最后,p1 与 p2 任一指针为 NULL 时算法结束。

3、 求两个有序单链表的差集,设置两个指针 p1、p2 开始时分别 指向 L1 和 L2 的开始结点。循环进行以下判断和操作: 如果 p 所指结点的值小于 q 所指结点的值,则 p 后移一位; 如果 q 所指结点的值小于 p 所指结点的值,则 q 后移一位; 如果两者所指结点的值相同,则删除 p1 所指结点。 最后,p 与 q 任一指针为 NULL 时算法结束。

标签:p2,结点,p1,next,单链,应用,L1,数据结构,LinkNode
From: https://blog.csdn.net/weixin_75253037/article/details/141256057

相关文章

  • kafka应用
    记录一下,以后尝试一下日志处理与分析推荐数据流系统监控与报警CDC(数据变更捕获)系统迁移事件溯源消息队列1.日志处理与分析日志收集是Kafka最初的设计目标之一,也是最常见的应用场景之一。可以用Kafka收集各种服务的日志,如web服务器、服务器日志......
  • IMU惯性测量模块在ROS环境下的应用示例
    Ubuntu版本:20.04;ROS环境:noetic;IMU型号:亚博10轴IMU惯导模块目录一.ROS环境配置1、在终端运行对应的命令 2、安装ROS串口驱动二、IMU软件包使用1、新建、编译工作空间 2、绑定IMU端口3、修改参数配置 三、运行可视化界面 1、运行launch文件2、可能遇到的问题3、......
  • Phpstorm环境配置与应用
    PhpStorm是一款由JetBrains开发的PHP专用的集成开发环境(IDE),它提供了强大的功能,包括代码编辑、调试、版本控制、单元测试等,适用于PHP开发者进行高效编程。以下是关于如何配置和应用PhpStorm的一些基本步骤:1.安装PhpStorm首先,你需要从JetBrains官方网站下载PhpS......
  • Xinference实战指南:全面解析LLM大模型部署流程,携手Dify打造高效AI应用实践案例,加速AI
    Xinference实战指南:全面解析LLM大模型部署流程,携手Dify打造高效AI应用实践案例,加速AI项目落地进程XorbitsInference(Xinference)是一个开源平台,用于简化各种AI模型的运行和集成。借助Xinference,您可以使用任何开源LLM、嵌入模型和多模态模型在云端或本地环境中运行推理,并......
  • 【MPC】模型预测控制 | 在车辆控制中的应用(二)目标函数构建
    写在前面:......
  • 掌握 PyTorch 张量乘法:八个关键函数与应用场景对比解析
    PyTorch提供了几种张量乘法的方法,每种方法都是不同的,并且有不同的应用。我们来详细介绍每个方法,并且详细解释这些函数有什么区别:1、torch.matmultorch.matmul是PyTorch中用于矩阵乘法的函数。它能够处理各种不同维度的张量,并根据张量的维度自动调整其操作方式。torch......
  • type-C接口的应用和PD取电快充协议的介绍
    USB快充控制芯片又称为快充诱骗芯片,是一种集成电路,主要用来和充电器内部的供电协议芯片进行通讯握手快充协议。它一般应用在Type-C接口的控制电路中,可以和充电器通讯,获取充电器的快充电压。电路中使用这种Type-C控制芯片后,可以自适应市面上各家的快充协议充电器,使其输出快充电......
  • pd协议的工作原理和应用
    PD协议通过type-C接口的CC线进行通信,协商电压、电流及供电方向。通信过程需要按照特定的数据包格式进行,存在相互认证的过程,当电缆接通后PD协议的SOP通信在CC线上进行从此来选择电源传输的规格。PD协议的优势在于其通用性和智能控制方式,使得一个充电器可以配置多个设备。XSP08Q......
  • 图数据库在社交网络分析中的应用
    图数据库在社交网络分析中的应用广泛且深入,其独特的数据结构和高效的查询能力为理解和分析复杂的社交网络关系提供了强有力的支持。以下将详细探讨图数据库在社交网络分析中的多个方面,包括用户关系建模、推荐系统优化、实时社交分析、影响力分析、欺诈检测与安全、知识图谱......
  • 智慧安防/一网统管/视频监控EasyCVR视频汇聚平台的视频轻量化特点及应用
    在数字化时代,视频监控已成为保障公共安全、提升管理效率的重要手段。随着技术的不断进步,EasyCVR视频汇聚平台应运而生,平台以其独特的视频轻量化特点在安防监控领域展现出强大的应用潜力。本文将详细探讨EasyCVR视频汇聚平台的视频轻量化特点及其应用。一、视频轻量化特点1)高效接......