实验内容

一.将单链表按基准划分,以单链表的首节点值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;    //返回新多项式的头结点
}

运行结果:

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

  1. 数据结构实验1单链表

    文章目录 实验1 单链表 一. 实验目的或任务 二. 实验教学基本要求 三. 实验教学的内容或要求 需要word文件请访问 http://daxs.top 站内搜索实验名称或者实验内容访问文章并且下载 ...

  2. 图的遍历c语言数据结构实验报告,数据结构实验报告--图的遍历

    江 西 理 工 大 学 数据结构 实验报告 实验名称 图的遍历 日期 2014-12-01 专业班级 计算机(中加)131班 地点 信息学院621 实验人 王鹏伟 学号 同组人 单独完成 152013 ...

  3. 图的遍历c语言数据结构实验报告,数据结构图的遍历实验报告.doc

    数据结构图的遍历实验报告.doc 实 验 报 告课程名称 数据结构实验名称 图的遍历姓 名专 业 计算机科学与技术班 级 计算机学 号成绩计算机科学与技术学院实验教学中心2015 年 11 月 20 ...

  4. 单链表插入元素 注释 c语言,数据结构之无头单链表的相关练习题——C语言实现(详细注释)...

    本文中所用到的相关链表操作实现均在我上篇博客中:https://blog..net/haoziai905/article/details/87099287 1.删除无头单链表的非尾结点 这道题的重点就 ...

  5. 二叉树的遍历(c语言数据结构实验报告三)

    二叉树的遍历 一.实验目的或任务 二.实验教学基本要求 三.实验教学的内容或要求 1. 编写函数,输入字符序列,建立二叉树的二叉链表 2. 编写函数,实现二叉树的中序递归遍历算法. 3. 编写函数,实 ...

  6. c语言单链表设计报告,单链表实验报告

    <数据结构>实验报告二 分校: 学号: 日期: 班级: 姓名: 程序名: L2311.CPP 一.上机实验的问题和要求: 单链表的查找.插入与删除.设计算法,实现线性结构上的单链表的产生以 ...

  7. c语言工程合并报告,C语言《数据结构》实验报告】链表的合并

    <C语言<数据结构>实验报告]链表的合并>由会员分享,可在线阅读,更多相关<C语言<数据结构>实验报告]链表的合并(8页珍藏版)>请在人人文库网上搜索. ...

  8. 数据结构c语言版实验报告2,数据结构(C语言版) 实验报告 (2)

    <数据结构(C语言版) 实验报告 (2)>由会员分享,可在线阅读,更多相关<数据结构(C语言版) 实验报告 (2)(15页珍藏版)>请在人人文库网上搜索. 1.数据结构(C语言 ...

  9. C语言数据结构线性表上机实验报告,数据结构实验报告实验一线性表_图文

    数据结构实验报告实验一线性表_图文 更新时间:2017/2/11 1:23:00  浏览量:763  手机版 数据结构实验报告 实验名称: 实验一 线性表 学生姓名: 班 级: 班内序号: 学 号: ...

最新文章

  1. 周志华教授专著《集成学习:基础与算法》上市,破解AI实践难题
  2. 又一款4800像素手机曝光:vivo V15 Pro
  3. 介绍微服务框架Micro笔记
  4. crontab定时执行python脚本_linux下使用crontab定时执行python脚本
  5. linux 5识别网卡,CentOS 5.5系统识别不了Atheros AR8151网卡怎么办?
  6. C++ primer 第8章 IO库
  7. mac nginx加载php 配置,Mac下Nginx安装环境配置详解
  8. 数据库_day03_对数据库的基本操作
  9. Too many input arguments.
  10. OpenGL杂七杂八
  11. wpf 怎样判断是否选中 checkbox_怎样判断一个人是否缺爱?
  12. (十二)random模块
  13. 《Python源码剖析》.pdf
  14. 什么样的会员管理才叫有效果的会员运营方案?
  15. linux离线安装caddy,GitHub - scriptsboy/aria2: LACY:Linux一键安装Aria2 + Caddy + YAAW实现离线下载、在线播放。...
  16. 如何自定义Steam搜索设置
  17. HTML的relative与absolute区别
  18. 落枕了睡觉还枕枕头吗_兄弟,你还枕头吗?
  19. P4417 [COCI2006-2007#2] STOL
  20. 基于html5手机移动端对话框特效

热门文章

  1. 并发编程之原子性及同步锁
  2. 谈谈互联网时代的信息安全——如何让自己不受骗
  3. 【解决方案】VS2013外部工具中添加ildasm.exe
  4. 全网最简单的百度网盘提速方法!!!!
  5. hypermill 2018多轴编程带刀路3D图档
  6. java在文件中输出换行符
  7. 使用Kafka订阅数据库的实时Binlog
  8. Kafka消息积压案例分析
  9. 常规放大电路和差分放大电路
  10. 软件定义网络SDN(计算机网络-网络层)