数据结构算法实现:利用两个线性表LA和LB分别表示两个集合A和B,现要求一个新的集合A=A并B。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构算法实现:利用两个线性表LA和LB分别表示两个集合A和B,现要求一个新的集合A=A并B。相关的知识,希望对你有一定的参考价值。
利用两个线性表LA和LB分别表示两个集合A和B,现要求一个新的集合A=A并B。
算法是
void union(List &La,List Lb)
La_len=ListLength(La);
Lb_len=ListLength(Lb);
for(i=1;i<=Lb_len;i++)
GetElem(Lb,i,e);
if(!LocateElem(La,e,equal)) ListInsert(La,++La_len,e);
(就是严蔚敏版的数据结构(c语言版)的20页例2-1的算法,用c语言实现)
用线性表,单链表实现算法。C语言的啊~~~~~~~
void Union(LinkList *L1,LinkList *L2,LinkList *&L3)//交集
LinkList *p=L1->next,*q=L2->next,*s,*c;
L3=(LinkList *)malloc(sizeof(LinkList));
L3->next=NULL;
c=L3;
while(p!=NULL&&q!=NULL)
if(p->data<q->data)
s=(LinkList *)malloc(sizeof(LinkList));//复制结点
s->data=p->data;
c->next=s;c=s;
p=p->next;
else if(p->data>q->data)
s=(LinkList *)malloc(sizeof(LinkList));
s->data=q->data;
c->next=s;c=s;
q=q->next;
else
s=(LinkList *)malloc(sizeof(LinkList));
s->data=p->data;
c->next=s;c=s;
p=p->next;
q=q->next;
while(q!=NULL)
s=(LinkList *)malloc(sizeof(LinkList));
s->data=q->data;
c->next=s;c=s;
q=q->next;
c->next=NULL;
while(p!=NULL)
s=(LinkList *)malloc(sizeof(LinkList));
s->data=p->data;
c->next=s;c=s;
p=p->next;
c->next=NULL;
参考技术A 由于LA和LB已经是集合,所以它们自己不会存在相同的元素,但LA和LB可能存在存在相同的元素,在LB的某个元素添加到LA的时候要判断LA是否已经存在这个元素。 参考技术B 算法不是有了吗
关于线性表的一些简单应用
关于线性表的基本操作见http://www.cnblogs.com/zydark/p/7778131.html
利用线性表LA和LB分别表示两个集合A和B,现在要求一个新的集合,新集合为A与B的并集
要求扩大线性表A,将存在于B中不在A中的元素插入到表A中去。
1 #include "seqlist.h" 2 int main1(void) 3 { 4 seqlist LA, LB; 5 InitList(&LA); 6 InitList(&LB); 7 int a []= { 1,3,5,7 }; 8 int b[] = { 1,2,3,4 }; 9 int LA_len, LB_len; 10 for (int i = 1; i <= 4; i++) 11 ListInsert(&LA, i, a[i-1]); 12 for (int j = 1; j <= 4; j++) 13 ListInsert(&LB, j, b[j-1]); 14 LA_len = ListLength(LA); 15 LB_len = ListLength(LB); 16 Datatype e; 17 for (int k = 1; k <= LB_len; k++) 18 { 19 Getelem(LB, k-1, &e);//依次取出LB中的元素 20 if (Locateelem(LA, e)==-1) //Lb中的元素和LA不相等则插入 21 22 ListInsert(&LA, ++LA_len, e); 23 } 24 25 26 for (int num = 1; num <=LA.length; num++) 27 printf("%d\\n", LA.data[num-1]); 28 getchar(); 29 return 0; 30 }
已知线性表LA和LB中的数据元素按值递减有序排列,要求将LA和LB归并为一个新的线性表LC
且LC中的数据元素仍按值非递减有序排列
设LA=(3,5,8,11)
LB=(2,6,8,9,11,15,20)
LC=(2,3,5,6,8,8,9,11,11,15,20)
用m和n分别对应表A与表B分别取两个表中的数据在第一次while后,长度较短的链表A
中的值已经全部插入到LC中,后两个while循坏使所有数据全部插入。
1 int main2() 2 { 3 seqlist LA, LB,LC; 4 InitList(&LA); 5 InitList(&LB); 6 InitList(&LC); 7 int i, j, m=0, n=0,k=0; 8 int p[] = { 3,5,8,11 }; 9 int q[] = { 2,6,8,9,11,15,20 }; 10 int LA_len, LB_len; 11 for ( i = 1; i <= 4; i++) 12 ListInsert(&LA, i, p[i - 1]); 13 for (j = 1; j <= 7; j++) 14 ListInsert(&LB, j, q[j - 1]); 15 LA_len = ListLength(LA); 16 LB_len = ListLength(LB); 17 Datatype a,b; 18 while (m < LA_len&&n < LB_len) 19 { 20 Getelem(LA, m , &a); 21 Getelem(LB, n, &b); 22 if (a <= b) 23 { 24 ListInsert(&LC, ++k, a); 25 m++; 26 } 27 else 28 { 29 ListInsert(&LC, ++k, b); 30 n++; 31 } 32 33 } 34 while (m < LA_len) 35 { 36 Getelem(LA, m++, &a); 37 ListInsert(&LC, ++k, a); 38 } 39 while (n < LB_len) 40 { 41 Getelem(LB, n++, &b); 42 ListInsert(&LC, ++k, b); 43 } 44 for (int l = 0; l < LA_len + LB_len; l++) 45 { 46 printf("%d\\n",LC.data[l]); 47 } 48 49 getchar(); 50 return 0; 51 }
以上是关于数据结构算法实现:利用两个线性表LA和LB分别表示两个集合A和B,现要求一个新的集合A=A并B。的主要内容,如果未能解决你的问题,请参考以下文章
设有线性表LA=(3,5,8,11)和LB=(2,6,8,9,11,15,20),若LA和LB分别表示两个集合A和B,求新聚合C=A并B(即相同