数据结构算法 两线性表A,B求交集。。。请高手指点!!!

已知按值递增有序排练的两个线性表A和B,且每个线性表内部各元素互不相同。试构造线性表C,使其是A和B的交集,且其中的数字同样按值递增排列。 要求: 1)分别采用顺序表、单链表、双链表三种数据结构存储上述线性表A、B、C 2)编写一个通用的程序(无论线性表A、B和C采用顺序表、单链表还是双链表存储,该程序完全通用),实现对线性表C的构造-Known to increase the value ordered by the two linear tables A rehearsal and B, and each of the elements within the linear table from each other. Linear table test structure C, it is the intersection of A and B, and the same number of them increasing order by value. Requirements: 1) were used to order table, a single list, double-linked list data structure stored in the linear three tables A, B, C 2) write a generic program (either the linear form A, B and C using the order form, a single list, or double-linked list storage, the program is completely general), to achieve the construction of the linear form C

将A与B分别排序,然后求交。
例如:将A与B按升序排列,设A表头为P,B表头为Q,若A[P]>B[Q]那么Q++,若A[P]<B[Q]那么P++;如果A[P]=B[Q],Q++、P++,Count++,And[Count]=B[Q-1];当P或者Q其中一个达到了A或者B的表尾 算法结束。

以下是参考程序:
//----------------------------------------

#include <stdio.h>

int A[100001],B[100001];
int Ans[100001],Count,N,M;

void Swap(int &a,int &b)
{
int Temp=a;
a=b;
b=Temp;
}

void Sort(int L,int R,int A[])
{
int p,q,Mid;
if (L==R) return ;
Mid=A[(L+R)/2];
p=L-1;q=R+1;
do
{
p++;q--;
while (A[p]<Mid) p++;
while (A[q]>Mid) q--;
if (p<q) Swap(A[p],A[q]);
}while (p<q);
Sort(L,q,A);
Sort(q+1,R,A);
}

void Init()
{
int p,q;
p=q=1;
for (int i=2;i<=N;i++)
{
if (A[i]!=A[p])
{
p++;
A[p]=A[i];
}
}
for (int i=2;i<=M;i++)
{
if (A[i]!=B[q])
{
q++;
B[q]=A[i];
}
}

}

int main(void)
{
int p,q;
scanf("%d %d",&N,&M);//输入两个集合的元素的个数
for (int i=1;i<=N;i++)
scanf("%d",&A[i]);// 读取A集合
for (int i=1;i<=M;i++)
scanf("%d",&B[i]);//读取B集合
Sort(1,N,A);//A集合排序
Sort(1,M,B);//B集合排序
Init();//剔除同一集合的相同元素
p=q=1;
Count=0;
while (p<=N&&q<=M)//求解.
{
if (A[p]<B[q])
{
p++;
continue;
}
if (A[p]>B[q])
{
q++;
continue;
}
if (A[p]==B[q])
{
p++;q++;
Count++;
Ans[Count]=B[q-1];
continue;
}
}
for (int i=1;i<=Count;i++)
printf("%d ",Ans[i]);
return 0;
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-02-27
A的元素,如果有相同的就存入LC中,然后再LB的第二个元素........

两个线性表A和B求交集,并将结果放在A中,结果如图,求不出来大神看一下...
2)你的代码里将A的第一个元素和B的第一个元素进行了比较之后,如果发现不相等,你就会把A的第二个元素删除。这里我猜测你是想要删除第一个元素,只是代码写错了。这里最大的问题是,你还没把A的第一个元素和B的第二个元素进行比较呢,万一它们相等呢?不应该算交集吗?

...上的算法写了一个代码,有个循环有误,请高手指点!
不是循环有误,应该是字符输入的问题,因为g.xlist[i].data是一个字符,所输入的时候应连着输入吧 p={i,j,g.xlist[j].firstin,g.xlist[i].firstout};这里不知道为什么不能这么写,就改成了上面的写法*\/ P所指是一个结构体啊,当然不能直接赋值啊 ...

请教高手,我是数据结构的处学者,对于算法还不太熟悉,下面这道题,请问这...
1,q不等于L->next;进入if语句,这一点看起来,链表p和L是有关连的。2,指针pre接管(指向)链表p的后续结点。3,把链表q的当前结点,插入到L后面。分析:1,从p和L关系,和把p插入到L后面。可知,p就应该是在L的前面。或者是一个单循环链表。2,从if语句看来,只是改变了一个结点的操作。...

刚看完c语言,现在看数据结构感觉好难看不懂,请教高手指点!
同时在C++的STL库存在着类似线性表,串等类型,里面包含了类似像inistack的函数,可以直接调用。开始看的时候,这些函数可以想抽象点,先不管他怎么实现,先了解其函数作用及表面的算法思路即可。

请计算机高手回答,为什么《数据结构》和中的C算法原码,不能在C语言...
这类教材它们的目的是讲解算法思想,所以代码都是伪代码,也就是说是简写的代码,许多地方都是为了书写方便简写了,比如数组整体拷贝,它可能就用a[1..n]->b[1..n]代替了,但你要写的话,还是必须写上 for(int i=1;i<=n;i++) b[i]=a[i];...

...40 && ! (age > 60))) 这个代码有点晕,请高手指点一下
age大于20 并且 age小于等于60 并且 age小于40大于60

数据结构,中缀算术表达式,求后缀算术表达式,急急 急急急急急急急急...
首先你要知道一点就是中缀转为后缀时操作数的顺序是不会变的。另外“(”也不会出现在后缀表达式中。然后,你可以这样看,在这个表达式中,按照运算法则,应该先算(10-8),所以就是“10 8 -”在一起,然后再把(10-8)的结果乘以2,就变成了 10 8 - 2 *(因为*2是在10-8的后面),然后...

如何建立一个线性表,用c++的基本语法是什么?
用c++建立一个线性表有以下5步:1、准备数据:定义了顺序表的最大长度MAXLEN、顺序表数据元素的类型DATA以及顺序表的数据结构SLType。在数据结构SLType中,Listen为顺序表已存结点的数量,也就是当前顺序表的长度,ListData是一个结构数组,用来存放各个数据结点。我们认为该顺序表是一个班级学生的记录。...

求C++ 网络编程最好的书籍 谢谢了
2、数据结构数据结构 C++ 数据结构算法与应用3、C语言C程序设计语言(第2版·新版)---C语言“倚天屠龙双剑”---Brian W.Kernighan“C语言之父”C Primer Plus中文版(第五版)---C语言“倚天屠龙双剑”---Stephen PrataC程序设计(第三版)---谭浩强C语言大全(第四版)---HERBERT SCHILDTC语言接口与实现:创...

计算机,数据结构,二叉树的遍历,先序遍历,后序遍历,中序遍历,急急急急...
中序遍历为ABCD,前序遍历序列为CABD 前序遍历先访问根,所以C为根,在中序遍历中先访问左子树,再访问根,最后访问右子树,所以在中序序列中,C前面的为左子树,第二个访问的是左子树的根A以此类推可得这样的一棵二叉树:C \/ \\ A D \\ B 对这棵二叉树后序遍历可得后序序列为BADC ...

相似回答