【C语言】数据结构实验报告--单链表

article/2025/10/4 17:43:59

实验内容


一.将单链表按基准划分,以单链表的首节点值x为基准将该单链表分割为两部分,使所有小于x的结点排在大于或等于x的结点之前。

#include<stdio.h>
#include"linklist.cpp"void Split(LinkNode *&L)
{LinkNode *pre,*p;if(L->next == NULL || L->next->next == NULL)return;int x = L->next->data; // 将首节点赋给xpre = L->next;p = pre->next;while(p!=NULL){if(p->data < x){pre->next = p->next;p->next = L->next; // 将节点p插到表头 L->next = p;p = pre->next;}else{pre = p; // p,pre同步后移 p= pre->next;}} 
}
int main()
{LinkNode *L;ElemType a[] = {23,41,2,15,12,90,66,9};int n = sizeof(a)/sizeof(int); // 求整型数组的长度 CreateListR(L,a,n); // 创建链表 printf("L: "); DispList(L);printf("以首节点进行划分\n");Split(L);printf("L: "); DispList(L);DestroyList(L); // 销毁链表 return 0; } 

这里的linklist.cpp是一个单独保存单链表所有基本操作的C文件

运行结果:
在这里插入图片描述
二.:将两个单链表合并成一个单链表

#include<stdio.h>
#include "linklist.cpp"
void Union(LinkNode *L1,LinkNode *L2,LinkNode *&L3)
{LinkNode *p1 = L1->next,*p2 = L2->next,*r,*s;L3 = (LinkNode *)malloc(sizeof(LinkNode));r = L3;while(p1!=NULL && p2!=NULL){s = (LinkNode *)malloc(sizeof(LinkNode));s->data = p1->data;r->next = s;r = s;p1= p1->next;s = (LinkNode *)malloc(sizeof(LinkNode));s->data = p2->data;r->next = s;r = s;p2= p2->next; }while(p1!=NULL){s = (LinkNode *)malloc(sizeof(LinkNode));s->data = p1->data;r->next = s;r = s;p1= p1->next;}while(p2!=NULL){s = (LinkNode *)malloc(sizeof(LinkNode));s->data = p2->data;r->next = s;r = s;p2= p2->next;}r->next = NULL;} int main(){LinkNode *L1,*L2,*L3;ElemType a[] = {1,2,3,4,5,6,7};ElemType b[] = {8,9,10,11,12,13,14,15};int n = sizeof(a)/sizeof(int); // 求整型数组的长度 CreateListR(L1,a,n); // 创建链表 int m = sizeof(b)/sizeof(int); // 求整型数组的长度 CreateListR(L2,b,m); 	printf("L1: "); DispList(L1);printf("\nL2: "); DispList(L2);printf("将L1和L2合并:\n");Union(L1,L2,L3);printf("L3: "); DispList(L3);DestroyList(L3); // 销毁链表 return 0;}

三.实现两个多项式相乘,用单链表存储一元单项式,并实现两个多项式相乘的运算

#include<stdio.h>
#include<stdlib.h>
#include<math.h> #define LEN sizeof(Poly)typedef struct term{float coef;        //系数 int expn;        //指数 struct term *next;
}Poly,*Link;int LocateElem(Link p, Link s, Link &q); 
void CreatePolyn(Link &p,int m);    //创建多项式 
void PrintPolyn(Link p);            //打印多项式(表示)            
Link Reverse(Link p);                //逆置多项式 
Link MultiplyPolyn(Link A,Link B);    //多项式相乘 int main()
{Link P1,P2,P3;    //多项式 int L1,L2;        //多项式长度 printf("请输入第一个多项式的项数:");scanf("%d",&L1);CreatePolyn(P1,L1);printf("第一个多项式为:");printf("P1(X)=");PrintPolyn(P1);printf("请输入第二个多项式的项数:");scanf("%d",&L2);CreatePolyn(P2,L2);printf("第二个多项式为:");printf("P2(X)=");PrintPolyn(P2); printf("\n");printf("两个一元多项式相乘:   ");printf("P1(X)*P2(X)=");P3=MultiplyPolyn(P1, P2);PrintPolyn(P3);return 0;
}
int LocateElem(Link p, Link s, Link &q){ Link p1 = p->next;Link p2 = p;while(p1){if(s->expn > p1->expn){p1 = p1->next;p2 = p2->next;}else if(s->expn == p1->expn){q = p1; return 1;}else{q = p2;return 0;}}if(!p1){q = p2;return 0;}
}void CreatePolyn(Link &p,int m) 
{Link s,q;int i;p=(Link)malloc(LEN);p->next=NULL;for(i=0;i<m;i++){s=(Link)malloc(LEN);printf("输入系数和指数(以空格隔开):");scanf("%f %d", &s->coef, &s->expn);if(!LocateElem(p, s, q)){    //若没有相同指数项,则链入 s->next = q->next;q->next = s;}else{                        //若有相同指数项,则系数相加                        q->coef+=s->coef;}}
}
void PrintPolyn(Link p)
//打印显示多项式 
{Link s;s = p->next;while(s){printf(" %.2f X^%d", s->coef, s->expn);s = s->next;if(s!=NULL)  if(s->coef>=0) printf(" +");//若下一项系数为正,则打印'+',否则不打印 }printf("\n");
}
Link Reverse(Link p) 
{Link head=p; Link q1,q2;q2=head->next;head->next=NULL;//断开头结点与第一个结点 while(q2){q1=q2;      q2=q2->next; q1->next=head->next; //头插 head->next=q1;  }      return head;//返回链表逆置后的头结点 
}
Link MultiplyPolyn(Link A,Link B)
{Link pa,pb,pc,s,head;int k,maxExpn,minExpn;float coef;head=(Link)malloc(LEN);//头结点 head->next=NULL;if(A->next!=NULL&&B->next!=NULL){minExpn=A->next->expn+B->next->expn; //minExpn为两个多项式中指数和的最小值 A=Reverse(A);//将A降幂排列 B=Reverse(B);//将B降幂排列 maxExpn=A->next->expn+B->next->expn; //maxExpn为两个多项式中指数和的最大值}else{return head;}       pc=head;B=Reverse(B);//将B升幂排列 for(k = maxExpn;k>=minExpn;k--){ //多项式的乘积指数范围为:minExpn~maxExpn//根据两项的指数和使每一次循环都得到新多项式中一项  pa = A->next;while(pa !=NULL&&pa->expn>k){  //找到pa的位置 pa = pa->next;}pb = B->next;while(pb!=NULL&&pa!=NULL&&pa->expn+pb->expn<k){//如果指数和和小于k,pb后移结点 pb = pb->next;}coef=0.0;while(pa!=NULL&&pb!=NULL){if(pa->expn+pb->expn==k){ //如果指数和等于k,系数和累加,且pa,pb均后移结点 coef+=pa->coef*pb->coef;pa=pa->next;pb=pb->next;}else if(pa->expn+pb->expn>k){//如果指数和大于k,pb后移结点pa = pa->next;}else{//如果指数和和小于k,pb后移结点pb = pb->next;}    }if(coef!=0.0){//如果系数和不为0,则生成新结点,将系数和指数赋给新结点后插入到新多项式中 s=(Link)malloc(LEN);s->coef=coef;s->expn=k;s->next=pc->next;pc->next=s;pc=s;}}B = Reverse(B);head=Reverse(head);return head;    //返回新多项式的头结点 
}

运行结果:

的


http://chatgpt.dhexx.cn/article/t2SOCDky.shtml

相关文章

数据结构实验报告(四)——查找和排序算法

实验目的 1. 掌握顺序查找技术和拆半查找技术以及部分排序算法的设计思想&#xff1b; 2. 掌握查找、部分排序算法的实现与执行过程。 实验原理 查找算法 1.顺序查找&#xff1a;从数组第一个元素开始逐个比较&#xff0c;找到后返回相应下标。 2.折半查找&#xff1a;从数组中…

数据结构实验--个人图书信息管理系统

数据结构实验 第一章 个人图书信息管理系统 第二章 停车场管理 第三章 哈夫曼编码 第一章 个人图书信息管理系统 数据结构实验前言一、需求分析二、概要设计三、详细设计1.全局变量、元素类型、结点类型和指针类型2.顺序表的基本操作3.主函数 总结 前言 线性表的顺序表示又称为…

【C语言】数据结构实验报告一

目录 题目1.1 求1~n的连续整数和。1.2 对于1到n的每个整数n&#xff0c;输出log2n&#xff0c;根号n&#xff0c;n ,nlog2n ,n^2 ,n^3 ,2^n ,n!的值。1.3 求1~n的素数的个数&#xff0c;并且计算出时间1.4 求1~n的连续整数阶乘的和。 题目 1.1 求1~n的连续整数和。 #include&…

数据结构实验:电话号码查询系统

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、问题描述二、问题描述&#xff08;1&#xff09;选用的散列函数&#xff08;2&#xff09;散列因子&#xff08;3&#xff09;解决冲突的方法 三、实验结果…

数据结构实验报告五 查找

一、实验目的 1、掌握查找表、动态查找表、静态查找表和平均查找长度的概念。 2、掌握线性表中顺序查找和折半查找的方法。 3、学会哈希函数的构造方法&#xff0c;处理冲突的机制以及哈希表的查找。 二、实验内容和要求 1.静态查找表技术 依据顺序查找算法和折半查找算法的…

数据结构实验公交车系统

数据结构实验公交车系统&#xff08;完整代码私信&#xff09; 1.查询公交车信息 2.查询站点信息 3.查询两个站点之间的路线&#xff08;最多一次换乘&#xff09; 4.添加、删除、修改公交车&#xff0c;站点&#xff0c;路线 创建4个文本文档&#xff08;即txt&#xff09; r…

数据结构实验报告六 排序

一、实验目的 1、掌握内部排序的基本算法&#xff1b; 2、分析比较内部排序算法的效率。 二、实验内容和要求 1.运行下面程序&#xff1a; #include <stdlib.h> #include <stdio.h> #define MAX 50 int slist[MAX]; /*待排序序列*/void insertSort(int list[],…

数据结构实验——哈夫曼编码

目录 问题描述 基本要求 问题分析 实验代码 运行结果 实验总结 问题描述 利用哈夫曼编码进行通信可以大大提高信道利用率&#xff0c;缩短信息传输时间&#xff0c;降低传输成本。但是&#xff0c;这要求在发送端通过一个编码系统对待传数据预先编码&#xff0c;在接收端…

数据结构实验C语言实现版

目录 数据结构实验——顺序表的基本操作 数据结构实验——单链表的基本操作 数据结构实验——顺序栈的建立及基本操作实现 数据结构实验——链队列的建立及基本操作实现 数据结构实验——赫夫曼树构造及赫夫曼编码的实现 数据结构实验——迪杰斯特拉算法求最短路径 数据结…

数据结构实验报告

数据结构与算法实验一&#xff08;顺序表的操作&#xff09; 一、实验目的 1&#xff0e;掌握线性表的顺序存储结构的表示和实现方法。 2&#xff0e;掌握顺序表基本操作的算法实现。 3&#xff0e;了解顺序表的应用。 二、实验内容 1&#xff0e;建立顺序表。 2&#xff0…

【数据结构】实验项目:顺序表,也就那么回事

目录 序 嗨&#xff0c;这里是狐狸~~ 简介 顺序表的结构定义&#xff1a; 声明顺序表类型变量&#xff1a; 实验内容&#xff1a; 实验说明 : 实验思路 1、 输入一组整型元素序列&#xff08;不少于10个&#xff09;&#xff0c;建立顺序表。 2&#xff0e; 在该顺…

数据结构(实验一)

第一次写报告&#xff0c;虽然有点简单&#xff0c;但还是要勉励自己再接再厉。加油 继续努力。 1.实验目的&#xff08;结出本次实验所涉及并要求掌握的知识点&#xff09; 1.掌握顺序表的存储结构形式及描述方法和基本运算的实现&#xff1b; 2.掌握用顺序表设计合理的数据…

数据结构实验

1.有序数组的插入 代码&#xff1a; bool Insert( List L, ElementType X ){//溢出if(L->LastMAXSIZE-1) return false;//插入在最后一位if(L->Data[L->Last] > X){L->Data[L->Last1]X;L->Last;return true;}int tp0;int find0;int tmp0;for(int i0;i &l…

网络传输大文件使用什么软件可以高速传输?

网络传输大文件使用什么软件可以高速传输&#xff1f;通过网络传输文件总是在速度上得不到很好的体现&#xff0c;更不用说是传输大文件了。本身支持大文件网络传输的工具就是不是很多&#xff0c;很多的传输工具对文件的大小都有所限制&#xff0c;要是想要找到一个高速传输大…

.mmap文件用什么软件可以打开?

1.下载MindManager专属打开它的软件 2。

什么是Saas软件?

人们常常会提及Saas&#xff08;萨斯&#xff09;软件&#xff0c;那么什么是Saas软件呢&#xff1f;首先大家通过百度可以看到百度百科的解释 相信大多数的伙伴们看了之后的感想就是一脸蒙圈&#xff0c;如果让自己给别人介绍什么是Saas软件还是记不住解释不清楚&#xff0c;那…

测试移动信号频率的软件,手机信号工作频段侦测软件

手机信号来源于基站发射的信号。但是常常会遇见的手机信号差&#xff0c;信号弱&#xff0c;上网速度慢等&#xff0c;都有可能是源于信号弱带来的。那么我们看见的手机上显示的信号弱&#xff0c;到底是什么信号弱&#xff1f;如何判别&#xff1f; 这里推荐一款APP软件&#…

杀毒软件可以查杀所有计算机病毒吗,杀毒软件可以查杀所有病毒吗

杀毒软件包括电脑杀毒软件和手机杀毒软件&#xff0c;那么杀毒软件可以查杀所有病毒吗&#xff1f;目前&#xff0c;做到所有病毒查杀还没有一家杀毒软件敢100%保证&#xff0c;因为电脑病毒也在日新月异的发展着&#xff0c;那是不是新病毒就查杀不了呢&#xff1f;也不是&…

可以测试电脑网络速度的软件,介绍4种有用的Internet Speed软件应用程序,用于测试网络速度软件...

当今社会将使用Internet&#xff0c;但是Internet的速度极大地影响了我们的工作和浏览. 在玩游戏和观看视频时测网速什么软件好&#xff0c;拥有一个良好的Internet甚至更为必要. 目前&#xff0c;我们可以使用Internet速度测试软件进行测试. 网络的速度和稳定性使您可以更好地…

什么软件可以测试鬼,PP助手新奇App推荐 《鬼魂探测器》能抓鬼?

最近&#xff0c;小伙伴们迷上了一款奇葩App&#xff0c;据说可以将潜伏在你周围的“阿飘”揪出来。这款软件就是《鬼魂探测器》&#xff0c;听起来是不是有点毛骨悚然&#xff0c;但又忍不住好奇心&#xff0c;通过PP助手下载一探究竟吧。 图1&#xff1a;PP助手(Win)2.0 只要…