逆位序(插在表头)输入n个元素的值,建立带表头结构的单链线性表L;正位序(插在表尾)输入n个元素的值,建立带表头结构的单链线性表;

已知单链线性表La和Lb的元素按值非递减排列,归并La和Lb得到新的单链线性表Lc,Lc的元素也按值非递减排列。

/* algo2-5.c 实现算法2.11、2.12的程序 *///#include"c1.h"/* c1.h (程序名) */#include<string.h>#include<ctype.h>#include<malloc.h> /* malloc()等 */#include<limits.h> /* INT_MAX等 */#include<stdio.h> /* EOF(=^Z或F6),NULL */#include<stdlib.h> /* atoi() */#include<io.h> /* eof() */#include<math.h> /* floor(),ceil(),abs() */#include<process.h> /* exit() *//* 函数结果状态代码 */#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1/* #define OVERFLOW -2 因为在math.h中已定义OVERFLOW的值为3,故去掉此行 */typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */typedef int Boolean; /* Boolean是布尔类型,其值是TRUE或FALSE */typedef int ElemType;//#include"c2-2.h"/* c2-2.h 线性表的单链表存储结构 */struct LNode{ElemType data;struct LNode *next;};typedef struct LNode *LinkList; /* 另一种定义LinkList的方法 *///#include"bo2-2.c"/* bo2-2.c 单链表线性表(存储结构由c2-2.h定义)的基本操作(12个) */Status InitList(LinkList *L){ /* 操作结果:构造一个空的线性表L */*L=(LinkList)malloc(sizeof(struct LNode)); /* 产生头结点,并使L指向此头结点 */if(!*L) /* 存储分配失败 */exit(OVERFLOW);(*L)->next=NULL; /* 指针域为空 */return OK;}Status DestroyList(LinkList *L){ /* 初始条件:线性表L已存在。操作结果:销毁线性表L */LinkList q;while(*L){q=(*L)->next;free(*L);*L=q;}return OK;}Status ClearList(LinkList L) /* 不改变L */{ /* 初始条件:线性表L已存在。操作结果:将L重置为空表 */LinkList p,q;p=L->next; /* p指向第一个结点 */while(p) /* 没到表尾 */{q=p->next;free(p);p=q;}L->next=NULL; /* 头结点指针域为空 */return OK;}Status ListEmpty(LinkList L){ /* 初始条件:线性表L已存在。操作结果:若L为空表,则返回TRUE,否则返回FALSE */if(L->next) /* 非空 */return FALSE;elsereturn TRUE;}int ListLength(LinkList L){ /* 初始条件:线性表L已存在。操作结果:返回L中数据元素个数 */int i=0;LinkList p=L->next; /* p指向第一个结点 */while(p) /* 没到表尾 */{i++;p=p->next;}return i;}Status GetElem(LinkList L,int i,ElemType *e) /* 算法2.8 */{ /* L为带头结点的单链表的头指针。当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR */int j=1; /* j为计数器 */LinkList p=L->next; /* p指向第一个结点 */while(p&&j<i) /* 顺指针向后查找,直到p指向第i个元素或p为空 */{p=p->next;j++;}if(!p||j>i) /* 第i个元素不存在 */return ERROR;*e=p->data; /* 取第i个元素 */return OK;}int LocateElem(LinkList L,ElemType e,Status(*compare)(ElemType,ElemType)){ /* 初始条件: 线性表L已存在,compare()是数据元素判定函数(满足为1,否则为0) *//* 操作结果: 返回L中第1个与e满足关系compare()的数据元素的位序。 *//*           若这样的数据元素不存在,则返回值为0 */int i=0;LinkList p=L->next;while(p){i++;if(compare(p->data,e)) /* 找到这样的数据元素 */return i;p=p->next;}return 0;}Status PriorElem(LinkList L,ElemType cur_e,ElemType *pre_e){ /* 初始条件: 线性表L已存在 *//* 操作结果: 若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱, *//*           返回OK;否则操作失败,pre_e无定义,返回INFEASIBLE */LinkList q,p=L->next; /* p指向第一个结点 */while(p->next) /* p所指结点有后继 */{q=p->next; /* q为p的后继 */if(q->data==cur_e){*pre_e=p->data;return OK;}p=q; /* p向后移 */}return INFEASIBLE;}Status NextElem(LinkList L,ElemType cur_e,ElemType *next_e){ /* 初始条件:线性表L已存在 *//* 操作结果:若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的后继, *//*           返回OK;否则操作失败,next_e无定义,返回INFEASIBLE */LinkList p=L->next; /* p指向第一个结点 */while(p->next) /* p所指结点有后继 */{if(p->data==cur_e){*next_e=p->next->data;return OK;}p=p->next;}return INFEASIBLE;}Status ListInsert(LinkList L,int i,ElemType e) /* 算法2.9。不改变L */{ /* 在带头结点的单链线性表L中第i个位置之前插入元素e */int j=0;LinkList p=L,s;while(p&&j<i-1) /* 寻找第i-1个结点 */{p=p->next;j++;}if(!p||j>i-1) /* i小于1或者大于表长 */return ERROR;s=(LinkList)malloc(sizeof(struct LNode)); /* 生成新结点 */s->data=e; /* 插入L中 */s->next=p->next;p->next=s;return OK;}Status ListDelete(LinkList L,int i,ElemType *e) /* 算法2.10。不改变L */{ /* 在带头结点的单链线性表L中,删除第i个元素,并由e返回其值 */int j=0;LinkList p=L,q;while(p->next&&j<i-1) /* 寻找第i个结点,并令p指向其前趋 */{p=p->next;j++;}if(!p->next||j>i-1) /* 删除位置不合理 */return ERROR;q=p->next; /* 删除并释放结点 */p->next=q->next;*e=q->data;free(q);return OK;}Status ListTraverse(LinkList L,void(*vi)(ElemType))/* vi的形参类型为ElemType,与bo2-1.c中相应函数的形参类型ElemType&不同 */{ /* 初始条件:线性表L已存在 *//* 操作结果:依次对L的每个数据元素调用函数vi()。一旦vi()失败,则操作失败 */LinkList p=L->next;while(p){vi(p->data);p=p->next;}printf("\n");return OK;}void CreateList(LinkList *L,int n) /* 算法2.11 */{ /* 逆位序(插在表头)输入n个元素的值,建立带表头结构的单链线性表L */int i;LinkList p;*L=(LinkList)malloc(sizeof(struct LNode));(*L)->next=NULL; /* 先建立一个带头结点的单链表 */printf("请输入%d个数据\n",n);for(i=n;i>0;--i){p=(LinkList)malloc(sizeof(struct LNode)); /* 生成新结点 */scanf("%d",&p->data); /* 输入元素值 */p->next=(*L)->next; /* 插入到表头 */(*L)->next=p;}}void CreateList2(LinkList *L,int n){ /* 正位序(插在表尾)输入n个元素的值,建立带表头结构的单链线性表 */int i;LinkList p,q;*L=(LinkList)malloc(sizeof(struct LNode)); /* 生成头结点 */(*L)->next=NULL;q=*L;printf("请输入%d个数据\n",n);for(i=1;i<=n;i++){p=(LinkList)malloc(sizeof(struct LNode));scanf("%d",&p->data);q->next=p;q=q->next;}p->next=NULL;}void MergeList(LinkList La,LinkList *Lb,LinkList *Lc)/* 算法2.12 */{ /* 已知单链线性表La和Lb的元素按值非递减排列。 *//* 归并La和Lb得到新的单链线性表Lc,Lc的元素也按值非递减排列 */LinkList pa=La->next,pb=(*Lb)->next,pc;*Lc=pc=La; /* 用La的头结点作为Lc的头结点 */while(pa&&pb)if(pa->data<=pb->data){pc->next=pa;pc=pa;pa=pa->next;}else{pc->next=pb;pc=pb;pb=pb->next;}pc->next=pa?pa:pb; /* 插入剩余段 */free(*Lb); /* 释放Lb的头结点 */Lb=NULL;}void visit(ElemType c) /* ListTraverse()调用的函数(类型要一致) */{printf("%d ",c);}int main(){int n=5;LinkList La,Lb,Lc;printf("按非递减顺序, ");CreateList2(&La,n); /* 正位序输入n个元素的值 */printf("La="); /* 输出链表La的内容 */ListTraverse(La,visit);printf("按非递增顺序, ");CreateList(&Lb,n); /* 逆位序输入n个元素的值 */printf("Lb="); /* 输出链表Lb的内容 */ListTraverse(Lb,visit);MergeList(La,&Lb,&Lc); /* 按非递减顺序归并La和Lb,得到新表Lc */printf("Lc="); /* 输出链表Lc的内容 */ListTraverse(Lc,visit);}

建立带表头结构的单链线性表,归并La和Lb得到新的单链线性表Lc相关推荐

  1. 归并La和Lb得到新的线性表Lc

    已知线性表La和Lb中的数据元素按值非递减排列, 归并La和Lb得到新的线性表Lc,Lc的数据元素也按值非递减排列.主程序验证中,La和Lb中原始元素自行创建,屏幕结果输出中要求显示La和Lb中原始元 ...

  2. c语言两个线性表la lb,假设有两个集合A和B分别用两个线性表LA和LB表示,即.ppt

    假设有两个集合A和B分别用两个线性表LA和LB表示,即.ppt 循环链表是单链表的变形. 循环链表最后一个结点的link指针不为 0 (NULL),而是指向了表的前端. 为简化操作,在循环链表中往往加 ...

  3. c语言两个线性表la lb,有两个集合用两个线性表LA和LB表示即线性表中的数据元素即为集合中的成员现要求一个新的集合...

    <有两个集合用两个线性表LA和LB表示即线性表中的数据元素即为集合中的成员现要求一个新的集合>由会员分享,可在线阅读,更多相关<有两个集合用两个线性表LA和LB表示即线性表中的数据元 ...

  4. 【数据结构 C描述】有两个整数集合 A 和 B 分别用两个线性表 LA 和 LB 表示,求:一个新的集合A=A∪B,A仍然为纯集合,线性表采用链式存储方式。【单链表】

    这是我的作业题,作业写完后再附到博客中,可能代码写得很烂.虽然是C语言写的,但是我在其中加入了C++的写法,例如cout.我懒得写printf的格式控制符,所以用cout来输出内容,这样我感觉简便多了 ...

  5. 递增有序顺序表的插入 (20分) 实验目的:1、掌握线性表的基本知识 2、深入理解、掌握并灵活运用线性表。3、熟练掌握线性表的存储结构及主要运算的实现 已知顺序表L递增有序,将X插入到线性表的适当位置

    递增有序顺序表的插入 (20分) 实验目的:1.掌握线性表的基本知识 2.深入理解.掌握并灵活运用线性表.3.熟练掌握线性表的存储结构及主要运算的实现 已知顺序表L递增有序,将X插入到线性表的适当位置 ...

  6. 人们通常先在线性表尾部临时添加一个_数据结构学习笔记-线性表

    我们经常会处理一系列类型相同的数据, 创建这种元素组, 读取和修改 当我们处理一个具有有穷或者无穷的元素数据集的时候, 我们需要将其作为一个整体来管理和使用, 用变量去表示它们, 传入和传出函数等等. ...

  7. mysql导出数据到表格讲解大全(导出数据带表头,导出数据中文乱码问题解决)

    方法1 使用sqlyang工具 1.本地准备好一个文件 2.选择数据 3.点击图中所示按钮 ,选择复制所有行到剪贴板 4.一般都选择确定,无须修改 5 打开之前的文件,粘贴保存 方法2 使用mysql ...

  8. 带表头节点单链表及其基本应用

    带表头节点单链表及其基本应用 结构体及其宏定义和所需要的C语言库 #include <stdio.h> #include <stdlib.h> #define ERROR 0 ...

  9. 多对多关系需要建立中间表_【数据库基础】为什么需要三张表之多对多表结构设计...

    了解完一对一和一对多表结构设计,接下来一起了解一下多对多的表结构设计. 同样,咱们先来想一般什么场景需要用到多对多.假如说咱们有一个叫订单和一个叫商品的这两张表,这两张表的关系,它其实就是一个多对多的 ...

最新文章

  1. 关于从Image字段读取图片流并显示在PictureBox控件时报‘参数无效’异常的解决方法...
  2. 【软件-软件设计师】操作系统知识架构图
  3. mysql windows软件_windows版MySQL软件的安装
  4. 图数据库的知识表示与推理
  5. 超一流 | 从XLNet的多流机制看最新预训练模型的研究进展
  6. 基础省选+NOI-第2部分 数据结构进阶(II)
  7. python爬虫02
  8. java default value_java-如何为@RequestParam的defaultValue提供表达式
  9. 什么软件可以搜c语言的答案,跪求C语言答案
  10. [总结] 单颗粒分析(SPA, Single particle analysis)
  11. mongos魔兽世界模拟器
  12. 洛谷 P1338 末日的传说 解题报告
  13. IMDB算法(贝叶斯算法)
  14. 弗兰克·盖里为华纳兄弟设计新总部,犹如漂浮在高速公路的‘冰山’
  15. 中国大学慕课python答案 北京理工大学_中国大学慕课mooc_Python 语言程序设计_章节测验答案...
  16. 计算机专业云平台管理试题,练习题云平台/计算机软考考试试题-考试系统
  17. 重庆公需科目快速看视频方法自动学习 python
  18. 考财管一定要带科学计算机,注会财管吴相全老师推荐的计算器是哪个?
  19. 论文《Efficient palette-based decomposition and recoloring of images via RGBXY-space geometry》笔记
  20. window子系统 linux wsl ubuntu GUI 可视化ubuntu桌面

热门文章

  1. 水果识别苹果识别 橙子识别 香蕉识别
  2. MATLAB 验证时域和频域卷积定理
  3. 关于SSD的二三事,NAND闪存的一些常识
  4. cookie,sessionStorage 和 localStorage 的区别 cookie弊端
  5. 树莓派 1602A显示屏
  6. git仓库初始化及设置签名
  7. MySql笔记(从安装到熟练一站式笔记)
  8. UCOSII系统时间管理
  9. 双端原生小龟影视反编译教程
  10. 单表代替密码原理及算法实现