题目说明:
实现两个集合的并集AUB,
A={1,2,3,4,},B={5,3,1,6};
结果:{1,2,3,4,5,6}。
并集:相同部分取一次
代码解析:
1.建立A、B链表,将集合中的数据插入
2.合并两个链表,查找B中是否有与A相同元素,如不同插入到A链表中,最终得到的A链表极为最终结果
3.使用完后销毁A、B链表
代码实现:
typedef int ElemType;
typedef struct Node
{
ElemType data;
struct Node* next;
}Node,*List;
//初始化
void InitList(List plist)
{
assert(plist != NULL);
if (plist == NULL)
return;
plist->next = NULL;
}
//尾插
bool Insert_tail(List plist, int val)
{
Node* p =(Node*)malloc(sizeof(Node));
assert(plist != NULL);
if (plist == NULL)
return false;
p->data = val;
Node* q;
for (q = plist; q->next != NULL; q = q->next)
;
p->next = q->next;
q->next = p;
return true;
}
//销毁链表
void Destroy(List plist)
{
Node* p = plist->next;
while (plist->next != NULL)
{
p = plist->next;
plist->next = p->next;
free(p);
}
}
//输出链表中的值
void Show(List plist)
{
Node* p;
for (p = plist->next; p != NULL; p = p->next)
printf("%-4d", p->data);
printf("\n");
}
//求链表长度函数
int GetLength(List plist)
{
int count = 0;
for(Node* p = plist->next;p != NULL;p = p->next)
count++;
return count;
}
//获取pos下标的值
bool GetElem(List plist,int pos, ElemType* rtval)
{
if (pos < 0 || pos >= GetLength(plist))
return false;
Node* p = plist->next;
for (int i = 0; i < pos; i++, p = p->next)
;
*rtval = p->data;
return true;
}
//查找函数
Node* Search(List plist, ElemType val)
{
Node* p;
for ( p = plist->next; p != NULL; p = p->next)
{
if (val == p->data)
return p;
}
return NULL;
}
//合并函数
void Merge(List plistA, List plistB)
{
int val;
//遍历plistB
for (int i = 0; i < GetLength(plistB); i++)
{
//获取plistB中i下标的值
GetElem(plistB, i, &val);
//不存在的时候插入
if (Search(plistA, val) == NULL)
{
Insert_tail(plistA, val);
}
}
}
int main()
{
Node headA;
Node headB;
InitList(&headA);
InitList(&headB);
//A集合插入数据
Insert_tail(&headA, 1);
Insert_tail(&headA, 2);
Insert_tail(&headA, 3);
Insert_tail(&headA, 4);
//B集合插入数据
Insert_tail(&headB, 5);
Insert_tail(&headB, 3);
Insert_tail(&headB, 1);
Insert_tail(&headB, 6);
//打印一下,验证A\B内是否正确插入数据
Show(&headA);
Show(&headB);
//打印合并后的值
Merge(&headA, &headB);
Show(&headA);
//用完就要销毁
Destroy(&headA);
Destroy(&headB);
}
运行结果:
第一行:A集合
第二行:B集合
第三行:输出的新集合