//10.2-6 动态集合Union以两个不相交的集合S1和S2作为输入,输出集合S=S1US2包含了S1和S2的所有元素。该操作常常会破坏S1和S2。
//说明应如何选用一种合适的表数据结构,以便支持在O(1)时间内的UNION操作。方法是在链表中设置尾指针,然后将其中一个链表的尾指针连接到另一个链表的表头
#include <stdio.h>
#include <stdlib.h>
typedef struct CirList
{
int Element;
CirList *Next;
CirList *Tail;
}*Cl;
Cl InitCirList()
{
Cl list;
list=(Cl)malloc(sizeof(struct CirList));
if(!list)
exit(-1);
list->Next=list;
list->Tail=list->Next;
return list;
}
void Insert(int x,int position,Cl list)
{
Cl c=list;
int i=0;
while(i<position)
{
c=c->Next;
i++;
}
Cl node;
node=(Cl)malloc(sizeof(struct CirList));
if(!node)
exit(-1);
node->Element=x;
node->Next=c->Next;
c->Next=node;
Cl q=list;
while(q->Next!=list)
q=q->Next;
list->Tail=q;
}
void Delete(Cl list,int position)
{
if(list->Next==list)
exit(-1);
Cl c=list;
int i=0;
while(i<position)
{
c=c->Next;
i++;
}
Cl node;
node=c->Next;
c->Next=node->Next;
free(node);
Cl q=list;
while(q->Next!=list)
q=q->Next;
list->Tail=q;
}
Cl Search(Cl list,int x)
{
Cl position;
position=list->Next;
while(position!=list&&position->Element!=x)
{
position=position->Next;
}
return position;
}
Cl Union(Cl list1,Cl list2)
{
list1->Tail->Next=list2->Next;
list1->Tail=list2->Tail;
return list1;
}
void print(Cl list)
{
Cl position;
position=list->Next;
while(position!=list->Tail->Next)
{
printf("%d ",position->Element);
position=position->Next;
}
printf("\n");
}
void main()
{
Cl list1,list2,list3,p1,p2;
list1=InitCirList();
list2=InitCirList();
Insert(1,0,list1);
Insert(2,0,list1);
Insert(7,1,list1);
Insert(8,1,list1);
print(list1);
Insert(1,0,list2);
Insert(2,0,list2);
Insert(7,1,list2);
Insert(8,1,list2);
print(list2);
list3=Union(list1,list2);
print(list3);
}
算法导论10.2-6答案
最新推荐文章于 2019-07-07 02:35:41 发布