假设以两个元素依值递增有序排列的线性表A和B分别表示两个集合,现要求另辟空间构成一个顺序链表C
2017-12-14 16:23
726 查看
题目有点长,反正是求交集是吧,网上的方法我看了,一般般,都是不知道怎么想出来的,晦涩难懂,这里介绍一下我自己的方法。
取A和B的交集就是取A和B中相同的元素,方法是从B中第一个元素开始,在A中依次查看是否有与他相同的元素,有就把这个值在C表中创建,没有的话接着B表下一次元素继续在A表中查看,直到B表全部元素都用上为止
要注意的是,题目要求另辟空间,也就是说不要动A和B表,网上的方法说什么把A和B合并,然后去除多余的元素,一看就有问题,题目都没理解清楚就做题。好了,下面是我的代码。
取A和B的交集就是取A和B中相同的元素,方法是从B中第一个元素开始,在A中依次查看是否有与他相同的元素,有就把这个值在C表中创建,没有的话接着B表下一次元素继续在A表中查看,直到B表全部元素都用上为止
要注意的是,题目要求另辟空间,也就是说不要动A和B表,网上的方法说什么把A和B合并,然后去除多余的元素,一看就有问题,题目都没理解清楚就做题。好了,下面是我的代码。
#include<stdio.h> #include<assert.h> #include<malloc.h> #define Elemtype int typedef struct SList { Elemtype data; struct SList *next; }Node; Node* _buynode(Elemtype x); void initial(Node **head); void push_back(Node **head,Elemtype x); void show(Node *head); Node* intersec(Node *ha,Node *hb); int main() { Node *ha,*hb,*hc; initial(&ha); initial(&hb); printf("构建有序链表a(-1结束)\n"); int x; while(1) { scanf("%d",&x); if(x==-1) break; push_back(&ha,x); } printf("这是链表a>>"); show(ha); printf("构建有序链表b(-1结束)\n"); while(1) { scanf("%d",&x); if(x==-1) break; push_back(&hb,x); } printf("这是链表b>>"); show(hb); printf("取交集后的链表\n"); hc=intersec(ha,hb); show(hc); return(1); } Node* _buynode(Elemtype x) {//本算法的功能是创建一个节点,其数据域赋值为x,并且返回该节点的指针 Node *s=(Node*)malloc(sizeof(Node)); assert(s!=NULL); s->data=x; s->next=NULL; return(s); } void push_back(Node **head,Elemtype x) {//本算法的前提是链表已经初始化 //本算法的功能是在链表的尾部插入一个新的节点 Node *p=*head; while(p->next!=NULL) { p=p->next; }//p指向尾节点 Node *s=_buynode(x); s->next=p->next; p->next=s; (*head)->data++;//表长加一 } void initial(Node **head) {//本算法的功能的是初始化一个单链表的头指针 (*head)=(Node*)malloc(sizeof(Node)); assert((*head)!=NULL); (*head)->data=0;//表长为0 (*head)->next=NULL; } void show(Node *head) {//本算法的前提是链表中至少有一个元素 //本算法的功能是依次显示链表中的数据 if(head->data==0) return;//表长的合法性判断 Node *p=head->next; while(p!=NULL) { printf("%d-->",p->data); p=p->next; } printf("Null.\n"); } Node* 4000 intersec(Node *ha,Node *hb) {//本算法的前提是链表a和b的元素都是按值递增有序排列的,并且都是一个集合 //本算法的功能是另辟一个链表C,C中的元素是链表a和b的交集,算法结束后,会返回链表 //C的头指针 Node *hc,*pa,*pb; initial(&hc); pa=ha->next; pb=hb->next; while(pb!=NULL)//b链表中的元素没有遍历完 { while(pa!=NULL && pa->data<pb->data) pa=pa->next; if(pa!=NULL && pa->data==pb->data) { Node *s=_buynode(pb->data); Node *p=hc; while(p->next!=NULL) p=p->next;//寻找hc的尾节点 s->next=p->next; p->next=s;//尾部插入 hc->data++;//表长加一 } pb=pb->next; pa=ha->next; } return(hc); }
相关文章推荐
- 数据结构链表习题2.27,假设以两个元素依值递增有序排列的线性表A和B分别表示两个集合,现要求另辟空间构成一个顺序链表
- 要完整准确的 均以单链表作存储结构 试编写算法将A表和B表归并成一个按元素值递减有序的线性表C 【数据结构】假设有两个按元素值递增有序的线性表A和B 并要求利用原表的空间存放C。谁会么
- 假设有两个按元素值递增有序排列的线性表A和B,均以单链表作存储结构,请编写算法将A表和B表归并为一个按元素值递减 有序(即非递增有序,允许表中含有值相同的元素)排列的线性表C,并要求利用原装(即A表和
- 假设有两个按元素值递增有序排列的线性表A和B,均以单链表作存储结构,请编写算法将A表和B表归并为一个按元素值递减 有序(即非递增有序,允许表中含有值相同的元素)排列的线性表C,并要求利用原装(即A表和
- 假设有两个按元素值递增有序排列的线性表A和B,均以单链表作存储结构,请编写算法将A表和B表归并为一个按元素值递减 有序(即非递增有序,允许表中含有值相同的元素)排列的线性表C,并要求利用原装(即A表和
- 假设利用两个线性表La和Lb分别表示两个集合A和B(即线性表中的数据元素即为集合中的成员),现要求一个新的 集合A=AUB。这就要求对线性表作如下操作:扩大线性表La,将存在于线性表Lb中而不存在于线
- 已知两个链表A和B分别表示两个集合,其元素递增排列。请设计算法求出两个集合A和B的差集(即仅由在A中出现而不在B中出现的元素所构成的集合),并以同样的形式存储,同时返回该集合的元素个数。
- 写程序。设ha和hb分别是两个带头结点的非递减有序单链表的头指针,试设计算法,将这两个有序链表合并成一个非递增有序的单链表。要求使用原链表空间,
- 链表的基本操作(创建,查找指定位置元素,删除指定元素,插入,倒置,去重,求集合的差,分别交换结点与交换结点值实现的冒泡排序,将两个有序链表合并成一个有序链表)c语言实现
- 将两个递增有序的单链表合并成一个递减有序的单链表,利用原结点空间
- 将两个递增的链表合并成一个递减的链表(相同的元素只留下一个),并要求利用原表结点
- 将两个递增有序的单链表合并成一个递减有序的单链表,利用原结点空间
- 递增有序的顺序表表示集合,求解两个集合的交集 并集 差集(c语言实现)
- Problem Description 有一个长度为n(n<=100)的数列,该数列定义为从2开始的递增有序偶数,现在要求你按照顺序每m个数求出一个平均值,如果最后不足m个,则以实际数量求平均值。编程输出该平均值序列。 Input 输入数据有多组,每组占一行,包含两个正整数n和m,n和m的含义
- 线性表的顺序表 实现,及应用-----西文排序+前m个元素和后n个元素进行整体互换+构造纯集合+有序表求纯集合+循环有序链表表示两集合的并集
- 已知两个链表 la和 lb,其元素值递增排序。编程将la和lb合并成一个递减有序(相同值元素只保留一个)的链表lc。(北方名校经典试题) 本题选做
- 已知线性表中元素以值递增有序排列,并以单链表作为存储结构,设计一个算法,删除表中值相同的多余元素
- 输入两个整数序列。其中一个序列表示栈的push顺序, 判断另一个序列有没有可能是对应的pop顺序。 为了简单起见,我们假设push序列的任意两个整数都是不相等的
- 给定一个链表的头指针,要求只遍历一次,将单链表中的元素的顺序翻转过来
- 设A和B是两个单链表,其表中元素递增有序,使用一算法将A和B归并成一个案元素递减有序的单链表C(该程序中的功能包含了上几个博客中的部分功能)