数据结构链表习题2.27,假设以两个元素依值递增有序排列的线性表A和B分别表示两个集合,现要求另辟空间构成一个顺序链表
2017-12-14 17:39
531 查看
方法:不太好表达,总之先保证a表中的指针不越界,然后依次和b表中的元素比较,如果b表中一个与之相等的元素都没有,那么指针pa指向的值就要删掉,否则向前移动,继续比较a表中的下一个元素。
需要注意的是,每次比较,应该先保证pa指向的指针与前面的值不相同,否则应该删除,代码的注释写得很详细,很简洁,就不多废话了
需要注意的是,每次比较,应该先保证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 0 typedef 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-& a6eb gt;size--;//表长减一 } } else { for(int i=pa;i<la->size-1;++i) la->base[i]=la->base[i+1]; la->size--; } } }
相关文章推荐
- 假设以两个元素依值递增有序排列的线性表A和B分别表示两个集合,现要求另辟空间构成一个顺序链表C
- 要完整准确的 均以单链表作存储结构 试编写算法将A表和B表归并成一个按元素值递减有序的线性表C 【数据结构】假设有两个按元素值递增有序的线性表A和B 并要求利用原表的空间存放C。谁会么
- 假设有两个按元素值递增有序排列的线性表A和B,均以单链表作存储结构,请编写算法将A表和B表归并为一个按元素值递减 有序(即非递增有序,允许表中含有值相同的元素)排列的线性表C,并要求利用原装(即A表和
- 假设有两个按元素值递增有序排列的线性表A和B,均以单链表作存储结构,请编写算法将A表和B表归并为一个按元素值递减 有序(即非递增有序,允许表中含有值相同的元素)排列的线性表C,并要求利用原装(即A表和
- 假设有两个按元素值递增有序排列的线性表A和B,均以单链表作存储结构,请编写算法将A表和B表归并为一个按元素值递减 有序(即非递增有序,允许表中含有值相同的元素)排列的线性表C,并要求利用原装(即A表和
- 已知两个链表A和B分别表示两个集合,其元素递增排列。请设计算法求出两个集合A和B的差集(即仅由在A中出现而不在B中出现的元素所构成的集合),并以同样的形式存储,同时返回该集合的元素个数。
- 假设利用两个线性表La和Lb分别表示两个集合A和B(即线性表中的数据元素即为集合中的成员),现要求一个新的 集合A=AUB。这就要求对线性表作如下操作:扩大线性表La,将存在于线性表Lb中而不存在于线
- 写程序。设ha和hb分别是两个带头结点的非递减有序单链表的头指针,试设计算法,将这两个有序链表合并成一个非递增有序的单链表。要求使用原链表空间,
- 数据结构习题分析:已知由一个线性链表表示的线性表中含有三类字符的数据元素,是编写算法将该线性表分割为三个循环链表,其中每个。。。。。
- 链表的基本操作(创建,查找指定位置元素,删除指定元素,插入,倒置,去重,求集合的差,分别交换结点与交换结点值实现的冒泡排序,将两个有序链表合并成一个有序链表)c语言实现
- Problem Description 有一个长度为n(n<=100)的数列,该数列定义为从2开始的递增有序偶数,现在要求你按照顺序每m个数求出一个平均值,如果最后不足m个,则以实际数量求平均值。编程输出该平均值序列。 Input 输入数据有多组,每组占一行,包含两个正整数n和m,n和m的含义
- 递增有序的顺序表表示集合,求解两个集合的交集 并集 差集(c语言实现)
- 将两个递增有序的单链表合并成一个递减有序的单链表,利用原结点空间
- 【C语言版数据结构】线性表的链式表示,并且实现合并两个非递减有序排列到新的线性表
- 数据结构之将两个递增的有序链表合并为一个递增的有序链表
- 将两个递增的链表合并成一个递减的链表(相同的元素只留下一个),并要求利用原表结点
- 将两个递增有序的单链表合并成一个递减有序的单链表,利用原结点空间
- 已知线性表中元素以值递增有序排列,并以单链表作为存储结构,设计一个算法,删除表中值相同的多余元素
- 线性表的顺序表 实现,及应用-----西文排序+前m个元素和后n个元素进行整体互换+构造纯集合+有序表求纯集合+循环有序链表表示两集合的并集
- 已知两个链表 la和 lb,其元素值递增排序。编程将la和lb合并成一个递减有序(相同值元素只保留一个)的链表lc。(北方名校经典试题) 本题选做