( 1 ) 将两个递增的有序链表合并为一个递增的有序链表。要求结果链表仍使用原来两个
链表的存储空间,不另外占用其它的存储空间。表中不允许有重复的数据。

#include<stdio.h>
typedef struct Lnode
{int data;struct Lnode *next;} Lnode,*Link;
void createlist(Link &L,int n,int z[]);
void listput(Link &L1,Link &L2,Link &L3);
main()
{   Link a1,a2,a3;int an=5,bn=6;int a[an]={2,4,7,3,9};int b[bn]={5,12,13,1,15,2};createlist(a1,an,a);createlist(a2,bn,b);listput(a1,a2,a3);
}
void createlist(Link &L,int n,int z[])
{Lnode *p,*r,*L1;L=new Lnode; //分配一个Londe类型的动态内存空间,指针变量L指向这个空间地址。L->next=NULL;L1=L;p=new Lnode;p->data=z[0];p->next=NULL;L->next=p;for(int i=1;i<n;i++){r=L;p=new Lnode;p->data=z[i];for(int j=0;j<i;j++){   if(p->data<r->next->data){ p->next=r->next;r->next=p;break;}else{  r=r->next;if(!r->next){  r->next=p; p->next=NULL;  }  }}}printf("序列:");while(L1->next){L1=L1->next;printf("%d ",L1->data);} printf("\n");
}
void listput(Link &L1,Link &L2,Link &L3)
{Lnode *s1,*s2,*r1,*q; s1=L1->next;s2=L2->next;L3=L1; r1=L3;while(s1&&s2){ if(s1->data<s2->data) {  r1->next=s1; r1=s1; s1=s1->next;  }else if(s1->data>s2->data){   r1->next=s2;r1=s2; s2=s2->next; }else {r1->next=s1;r1=s1; s1=s1->next;q=s2->next;delete s2;s2=q;    }
}r1->next=s1?s1:s2;/*?:是一个条件运算符,比如P=A?B:C,它表示---若A为真,则用P=B,若A为假,则用P=C.*/delete L2;   printf("结果:");while(L3->next){ L3=L3->next; printf("%d ",L3->data);}
}

( 2 ) 将两个非递减的有序链表合并为一个非递增的有序链表。要求结果链表仍用原
两个链表的存储空间, 不另外占用其它的存储空间。表中允许有重复的数据。

int listreverse(Link &L)  //单链表递归倒序输出
{L=L->next;Lnode *r;r=L;if(!L)return 0;elselistreverse(L);printf("%d ",r->data);
}void listreverse(Lnode *L)  //前插法倒序输出
{Lnode *r,*p,*L1;p=L->next;L1=L;L1->next=NULL; while(p)  {   r=p->next;p->next=L1->next;L1->next=p;p=r;}printf("结果:");  while(L1->next)   {  L1=L1->next; printf("%d ",L1->data);  }
}

( 3 ) 巳知两个链表A 和B 分别表示两个集合, 其元素递增排列。请设计算法求出A 与
B 的交集, 并存放于A 链表中。

void listputmix(Link &L1,Link &L2,Link &L3) //两个单链表的交集
{Lnode *p1,*p2,*r,*q;p1=L1->next;p2=L2->next;L3=L1;r=L3;while(p1&&p2){if(p1->data<p2->data){  q=p1; p1=p1->next;  delete q;  }else if(p1->data>p2->data){  q=p2; p2=p2->next;  delete q; }else if(p1->data==p2->data){ r->next=p1;r=p1;p1=p1->next;q=p2;p2=p2->next;  delete q; }}while(p1) { q=p1; p1=p1->next, delete q;  }while(p2) { q=p2; p2=p2->next, delete q;  }r->next=NULL;delete L2;printf("结果:");while(L3->next){ L3=L3->next; printf("%d ",L3->data);   }
}

( 4 ) 巳知两个链表A 和B 分别表示两个集合, 其元素递增排列。请设计算法求出两个
集合A 和B 的差集( 即仅由在A 中出现而不在B 中出现的元素所构成的集合), 并以同样的
形式存储, 同时返回该集合的元素个数。

int listputdef(Link &L1,Link &L2,Link &L3) //两个单链表的差集(只出现在A中而不在B中出现)
{Lnode *p1,*p2,*r,*q;p1=L1->next;p2=L2->next;L3=L1;r=L3;int n=0; while(p1&&p2){if(p1->data<p2->data){  r->next=p1; r=p1; p1=p1->next; n++;}else if(p1->data>p2->data){  q=p2; p2=p2->next; delete q;}else if(p1->data==p2->data){ q=p1;p1=p1->next;  delete q; q=p2;p2=p2->next;  delete q; }}while(p1) {  r->next=p1; r=p1; p1=p1->next; }while(p2) { q=p2; p2=p2->next, delete q;  }r->next=NULL;  //一定要把最后一个结点的next指向为NULL,因为它原本的next指向的结点已经删除 delete L2;printf("结果:");while(L3->next){ L3=L3->next; printf("%d ",L3->data);   }return n;
}

( 5 ) 设计算法将一个带头结点的单链表A 分解为两个具有相同结构的链表B 、C , 其中
B 表的结点为A 表中值小于零的结点, 而C 表的结点为A 表中值于零的结点( 链表A 中的
元素为非零整数, 要求B 、C 表利用A 表的结点) 。

#include<stdio.h> //创建结点,作为另一条链表的头节点,前插法输出
typedef struct Lnode
{int data;struct Lnode *next;} Lnode,*Link;
void createlist(Link &L,int n,int z[]);
void DifCompose(Link &L);
main()
{   Link a1;int an=10;int a[an]={-2,5,-6,7,-1,12,-5,8,-9,10};createlist(a1,an,a);DifCompose(a1);
}
void createlist(Link &L,int n,int z[])
{Lnode *p,*r,*L1;L=new Lnode;L->next=NULL;r=L;L1=L;for(int i=0;i<n;i++){p=new Lnode;p->data=z[i];p->next=NULL;r->next=p;r=p;}printf("A:");while(L1->next) { L1=L1->next;printf("%d ",L1->data);} printf("\n");
}
void DifCompose(Link &L)
{Lnode *L1,*L2,*p,*r;L2=new Lnode;L2->next=NULL;p=L->next;L1=L;L1->next=NULL;while(p){  r=p->next;if(p->data<0){p->next=L1->next;L1->next=p;}else{   p->next=L2->next;L2->next=p;}p=r;}printf("B:");while(L1->next){   L1=L1->next;  printf("%d ",L1->data);  } printf("\n");printf("C:");while(L2->next){   L2=L2->next;  printf("%d ",L2->data);}
}void DifCompose(Link &L) //不创建结点,记录另一条链表的首元节点,后插法输出
{Lnode *p,*r1,*r2,*L1,*L2;p=L->next;r1=L;L1=L;int n=1;while(p){  if(p->data>0){    r1->next=p;r1=p;p=p->next;}else{   if(n>0){ r2=p; L2=p; p=p->next;n=0;}else {r2->next=p;r2=p;p=p->next;} }}r1->next=NULL;r2->next=NULL;printf("B:");while(L2){     printf("%d ",L2->data);L2=L2->next;} printf("\n");printf("C:");while(L1->next){   L1=L1->next;  printf("%d ",L1->data);}
}

( 6 ) 设计一个算法, 通过一趟遍历在单链表中确定值最大的结点。

void listmax(Link &L) //遍历单链表最大值
{Lnode *p;int max;p=L->next;max=p->data;while(p->next){p=p->next;if(p->data>max)max=p->data;}printf("最大值:%d",max);
}

( 7 ) 设计一个算法, 通过遍历一趟, 将链表中所有结点的链接方向逆转, 仍利用原表的
存储空间。

void listreverse(Lnode *L)  //单链表所有结点的链接方向"原地"逆置
{Lnode *r,*p,*q;p=L;r=q=NULL;while(p)  //使得原来的每个后一结点指向前一结点,头结点的next指向空{    q=p->next;p->next=r;r=p;p=q;}printf("结果:");  while(r->next)   {  printf("%d ",r->data); r=r->next; }
}

( 8 ) 设计一个算法, 删除递增有序链表中值大于mink 且小于maxk 的所有元素( mink
和是给定的两个参数, 其值可以和表中的元素相同, 也可以不同)。

void Diflist(Link &L,int mink,int maxk) //无序单链表删除符合条件的元素
{Lnode *p,*r,*L1;L1=L;p=L->next;while(p){r=p->next;if(p->data>mink&&p->data<maxk)   {delete p; L1->next=r;}else{L1->next=p;L1=p; }    p=r;}while(L->next) { L=L->next;printf("%d ",L->data);}
}void Diflist(Link &L,int mink,int maxk) //有序单链表删除符合条件的元素
{Lnode *p,*r,*L1;L1=L;p=L->next;while(p){while(p->data>mink&&p->data<maxk){r=p->next;delete p;p=r;} L1->next=p;L1=p;p=p->next;}while(L->next) { L=L->next;printf("%d ",L->data);}
}

( 9 ) 已知指向双向循环链表中的一个结点, 其结点结构为data 、prior 、next 三个域,
写出算法p 所指向的结点和它的前结点的顺序。

#include<stdio.h>  //在双向循环链表中,第n个结点和前驱结点交换位置
typedef struct Lnode
{int data;struct Lnode *prior;struct Lnode *next;} Lnode,*Link;
void createlist(Link &L,int n,int z[]);
void change(Link &L,int n);
main()
{   Link a1;int n=6;int an=10;int a[an]={-2,5,-6,7,-1,12,-5,8,-9,10};createlist(a1,an,a);change(a1,n);
}
void createlist(Link &L,int n,int z[])
{Lnode *p,*r,*L1;L=new Lnode;r=L;L1=L;for(int i=0;i<n;i++){p=new Lnode;p->data=z[i];r->next=p;p->prior=r;r=p;}p->next=L;L->prior=p;printf("双向循环链表:");while(L1->next!=L) { L1=L1->next;printf("%d ",L1->data);} printf("\n");
}
void change(Link &L,int n)
{Lnode *p,*r,*k1,*k2,*L1;p=L; L1=L;for(int i=0;i<n;i++) { r=p;p=p->next; }k1=r->prior;k2=p->next;k1->next=p;p->next=r;r->next=k2;k2->prior=r;r->prior=p;p->prior=k1;printf("转变之后链表:");while(L1->next!=L) { L1=L1->next;printf("%d ",L1->data);}
}

数据结构严蔚敏(c语言版)课后算法题答案-线性表相关推荐

  1. 构建线性表的c语言代码,数据结构严蔚敏C语言版—线性表顺序存储结构(顺序表)C语言实现相关代码...

    1.运行环境 这里说明一下这里所有的C语言代码都是基于code::blocks 20.03编译运行的.当然一些其他集成开发环境应该也是可以的,个人不太喜欢功能太过强大的IDE,因为那同样意味着相关设置 ...

  2. 数据结构严蔚敏C语言版—线性表顺序存储结构(顺序表)C语言实现相关代码

    数据结构严蔚敏C语言版-线性表顺序存储结构(顺序表)C语言实现相关代码 1.运行环境 2.准备工作 1)项目构建 1>新建一个SeqList项目 2>新建两个文件Sources和Heade ...

  3. 7.查找——数据结构(严蔚敏 C语言版)

    7.查找 7.1概念 7.1.1查找的分类 查找表可分为两类: 静态查找表: 仅作"查询"(检索) 操作的查找表. 动态查找表: 作"插入"和"删除& ...

  4. 数据结构(C语言版)---第2章 线性表

    线性表 最常用最简单的一种数据结构:n个数据元素的有限序列 线性表的抽象数据类型定义 ADT List{ 数据对象:..... 数据关系:..... 基本操作:InitList(&L) 操作结 ...

  5. 厂工数据结构Anyview(C语言版)第二章答案

    第二章 一.实现顺序栈的判空操作 二.实现顺序栈的取栈顶元素操作 三.实现顺序栈的出栈操作 四.构建初始容量和扩容增量分别为size和inc的空顺序栈S 五.实现顺序栈的判空操作 六.实现顺序栈的入栈 ...

  6. 8.排序——数据结构(严蔚敏C语言版)

    8.排序 8.1概念 1.什么是排序? 排序:将一组杂乱无章的数据按一定规律顺次排列起来.即,将无序序列排成一个有序序列(由小到大或由大到小)的运算.如果参加排序的数据结点包含多个数据域,那么排序往往 ...

  7. 数据结构之二叉树_二叉排序树(严蔚敏C语言版)

    为什么80%的码农都做不了架构师?>>>    #include <iostream> #include <stdlib.h> #define elemTyp ...

  8. 4.树和二叉树——数据结构 (严蔚敏C语言版)

    4.树 4.1树的定义 树(Tree)是n(n≥0)个结点的有限集,它或为空树(n=0);或为非空树,对于非空树T: (1)有且仅有一个称之为根的结点; (2)除根结点以外的其余结点可分为m (m&g ...

  9. 数据结构(严蔚敏C语言版)代码实现持续更新中

    文章汇总: 线性表: 线性表的顺序表示和实现 线性表的链式表示和实现 静态链表的表示和实现 栈: 顺序栈--栈的顺序表示和实现 链栈--栈的链式表示和实现 队列: 链队列--队列的链式表示和实现 顺序 ...

  10. C++primer plus第六版课后编程题答案8.3(正解)

    在百度知道里面得到了正确的答案 http://zhidao.baidu.com/question/198940026560129285.html?quesup2&oldq=1 #include ...

最新文章

  1. 解决Titanium Tab组件click事件在iOS中不生效的方案
  2. 浏览器中的“Linux”
  3. buu RSAroll
  4. 母校/母语/母公司怎么说?
  5. ActiveMQ跟SpringBoot整合的双向队列
  6. tensorflow 滑动平均使用和恢复
  7. php server 连接字符串,sqlServer 数据库常用连接字符串
  8. python入门--字符串,切片
  9. Struts2——解耦方式
  10. 测者的测试技术手册:AI的自动化单元测试
  11. 如何配置程序集的版本策略
  12. 美媒:马斯克已掌管推特 立即开除CEO、CFO,新CEO据传是曾经卖牛肉的中国人
  13. PSP2000V3版5.03系统误删PSP文件夹的拯救方案
  14. 汉字在c语言中用什么表示,在C语言中显示汉字
  15. OCR算法识别性能评估
  16. 横向时间轴插件 html5,jQuery横向滚动时间轴插件
  17. 设置windows开机隐藏启动,隐藏欢迎界面
  18. 科技云报道:安全脱管不如托管
  19. 武士道的精神,就是死(转自知乎)
  20. 宇信科技有限公司面试题目

热门文章

  1. linux 查看gcc安装目录,linux安装GCC详解
  2. vscode中怎样格式化js代码_VSCode代码格式化设置
  3. matlab2015a安装秘钥_MATLAB2015a(2015b)安装教程
  4. c语言程序进制,C语言编程:进制转换器
  5. Extjs4.2里Grid显示日期类型数据
  6. CCNA CCNP全套教材 CCNA CCNP视频 CCNA CCNP最新题库解析
  7. HG255D电信原版刷机实战整理,既HG255D刷uboot、Openwrt
  8. UCD的产品设计原则
  9. 局域网带宽控制解决方案 P2P终结者使用详解
  10. 用命令连接其他计算机名,如何使用命令连接远程桌面?