数据结构链表习题2.27,假设以两个元素依值递增有序排列的线性表A和B分别表示两个集合,现要求另辟空间构成一个顺序链表
来源:互联网 发布:数控编程仿真软件 编辑:程序博客网 时间:2024/06/01 08:40
方法:不太好表达,总之先保证a表中的指针不越界,然后依次和b表中的元素比较,如果b表中一个与之相等的元素都没有,那么指针pa指向的值就要删掉,否则向前移动,继续比较a表中的下一个元素。
需要注意的是,每次比较,应该先保证pa指向的指针与前面的值不相同,否则应该删除,代码的注释写得很详细,很简洁,就不多废话了
#include<stdio.h>#include<malloc.h>#include<assert.h>#define SIZE 10#define EXTERN 1#define Elemtype int#define Status#define SUCCESS 1#define FAIL 0typedef struct SeqList{ Elemtype *base; int capacity; int size;}List;void initial(List *list);void push_back(List *list,Elemtype x);void show(List *list);Status Extern(List *list);void intersec(List *la,List *lb);int main(){ List la,lb; int x; initial(&la); initial(&lb); printf("创建顺序表a(-1结束)\n"); while(1) { scanf("%d",&x); if(x==-1) break; push_back(&la,x); } printf("这是顺序表a>>>"); show(&la); printf("创建顺序表b(-1结束)\n"); while(1) { scanf("%d",&x); if(x==-1) break; push_back(&lb,x); } printf("这是顺序表b>>>"); show(&lb); printf("取得交集后的顺序表>>>"); intersec(&la,&lb); show(&la); return(1);}void initial(List *list){//本算法的功能是初始化顺序表list list->base=(Elemtype*)malloc(SIZE*sizeof(Elemtype));//分配初始空间 assert(list->base!=NULL); list->capacity=SIZE;//容量为10 list->size=0;//表长为0}void push_back(List *list,Elemtype x){//本算法的前提是顺序表已经初始化并且内存空间还没有满 //本算法的功能是在顺序表的尾部插入一个数值x if(list->size==list->capacity&&!Extern(list)) return;//内存空间已满 list->base[list->size]=x; list->size++;//表长加一}void show(List *list){//本算法的前提是顺序表已经初始化并且至少有一个元素 //本算法的功能是依次显示表中的元素 if(list->size==0) return;//表长合法性判断 for(int i=0;i<list->size;++i) printf("%d ",list->base[i]); printf("\n");}Status Extern(List *list){//本算法的前提是顺序表已经存在 //本算法的功能是扩充顺序表的内存空间 Elemtype *newbase; newbase=(Elemtype*)realloc(list->base,(list->capacity+EXTERN)*sizeof(Elemtype)); if(newbase)//如果扩充成功 { list->base=newbase; list->capacity+=EXTERN; return(SUCCESS); } else { return(FAIL); }}void intersec(List *la,List *lb){//本算法的前提是顺序表a和b中的元素按值递增 //本算法的功能是求顺序表a和顺序表b的交集,并且交集C没有重复的元素 //交集C存放到顺序表a中 int pa=0,pb=0;//pa和pb分别指向顺序表la和lb中第一个元素 while(pa<la->size)//表a还没有遍历完 { if(pa==0 || pa!=0&&la->base[pa]!=la->base[pa-1])//如果不是pa指向第一个或者pa指向的元素和前面的不相同 { while(pb<lb->size && lb->base[pb]<la->base[pa]) pb++; if(pb<lb->size && lb->base[pb]==la->base[pa])//b中有和a中相同的元素,则保留a中这个元素 { pa++; } else//如果没有,则这个元素多余 { for(int i=pa;i<la->size-1;++i) la->base[i]=la->base[i+1]; la->size--;//表长减一 } } else { for(int i=pa;i<la->size-1;++i) la->base[i]=la->base[i+1]; la->size--; } }}
阅读全文
0 0
- 数据结构链表习题2.27,假设以两个元素依值递增有序排列的线性表A和B分别表示两个集合,现要求另辟空间构成一个顺序链表
- 假设以两个元素依值递增有序排列的线性表A和B分别表示两个集合,现要求另辟空间构成一个顺序链表C
- 假设有两个按元素值递增有序排列的线性表A和B,均以单链表作存储结构,请编写算法将A表和B表归并为一个按元素值递减 有序(即非递增有序,允许表中含有值相同的元素)排列的线性表C,并要求利用原装(即A表和
- 要完整准确的 均以单链表作存储结构 试编写算法将A表和B表归并成一个按元素值递减有序的线性表C 【数据结构】假设有两个按元素值递增有序的线性表A和B 并要求利用原表的空间存放C。谁会么
- 已知两个链表A和B分别表示两个集合,其元素递增排列。请设计算法求出两个集合A和B的差集(即仅由在A中出现而不在B中出现的元素所构成的集合),并以同样的形式存储,同时返回该集合的元素个数。
- 假设利用两个线性表La和Lb分别表示两个集合A和B(即线性表中的数据元素即为集合中的成员),现要求一个新的 集合A=AUB。这就要求对线性表作如下操作:扩大线性表La,将存在于线性表Lb中而不存在于线
- 写程序。设ha和hb分别是两个带头结点的非递减有序单链表的头指针,试设计算法,将这两个有序链表合并成一个非递增有序的单链表。要求使用原链表空间,
- 输入两个数列,分别以某数为结束标志,分别生成递增有序单链表;再将这两个表合并为一个递增有序单链表,输出表中各结点的值
- 数据结构之将两个递增的有序链表合并为一个递增的有序链表
- 已知线性表中元素以值递增有序排列,并以单链表作为存储结构,设计一个算法,删除表中值相同的多余元素
- 线性表a、b为两个有序升序的线性表,编写一程序,使两个有序线性表合并成为一个有序升序线性表h
- 将两个有序递增的链表合成一个有序递增的链表
- 将两个递增的有序链表合并为一个递增的有序链表
- 数据结构笔记(一)线性表的顺序表示和基本操作及其顺序表实现的集合运算(A-B)U(B-A)实例
- 【C语言版数据结构】线性表的链式表示,并且实现合并两个非递减有序排列到新的线性表
- 两个递增有序链表合并为一个链表
- 有两个顺序表LA,LB,其元素均为非递减有序排列,编写算法将它们合并成一个顺序表LC,要求LC也是非递减有序排列。
- 将两个递增的有序链表合并为一个递增的有序链表(C语言编程实现)
- 关于SparkStreaming运行案例时控制台不打印的问题
- 数据库(表结构)设计技巧及注意事项
- JAVA NIO 例子
- Eureka 源码解析 —— 应用实例注册发现(七)之增量获取
- Parameter 'userName' not found. Available parameters are [0, 1, 2, param3, param1, param2]
- 数据结构链表习题2.27,假设以两个元素依值递增有序排列的线性表A和B分别表示两个集合,现要求另辟空间构成一个顺序链表
- CSDN 第一篇博文
- linux下启动svn实例
- Spring Cloud (19) | Eureka Server 高可用服务注册中心
- Django实现CAS+OAuth2
- demon14.5-14.6
- 合并排序,合为重
- React中setState回调
- C语言总结