题目
线性表A和B分别表示两个集合A和B(同集合中的元素值各不相同、无序),用带头结点的单链表存储。
另辟空间构成一个线性表C,编写算法求C=A和B的差集。
结点结构:
typedef struct Node
{
int data;
struct Node *next;
}LNode,*LinkList;
要求:
(1)编写函数,实现输入数据建立集合单链表。
(2)编写函数,实现链表中元素的输出。
(3)如果需要复制链表,编写函数实现。
(4)编写函数,实现求集合A和B的差集C,保存到新的单链表。
调用上述函数,依次输出C中的元素。
Input
第1行输入A的元素个数
第2行输入A中的元素,以空格分隔
第3行输入B的元素个数
第4行输入B中的元素,以空格分隔
Output
依次输出C中的元素,以空格分隔。
(最后一个元素后面也有一个空格)
Sample Input
4
2 8 5 6
6
10 6 9 2 7 3
Sample Output
`8 5
#include "stdio.h"
#include "stdlib.h"
#include "conio.h"
typedef struct Node
{
int data;
struct Node *next;
}LNode,*LinkList;
LinkList createLinkList(int n)
{
LNode *head,*p,*q;
int i,info;
head=(LNode *) malloc(sizeof(LNode));
if (!head) return NULL;
head->next =NULL;
q=head;
for(i=1;i<=n;i++)
{
p=(LNode *) malloc(sizeof(LNode));
if (!p) return NULL;
// printf("\n Input the %dth element data: ",i);
scanf("%d",&info);
p->data=info;
q->next=p; p->next =NULL; //p指向的结点插入单链表的表尾
q=p; //q总是指向当前单链表的最后一个结点(表尾)
}
return head;
}
// 复制链表
LinkList copyList(LinkList list)
{
LinkList head = (LinkList)malloc(sizeof(LNode));
head->next = NULL;
LinkList p = list->next;
LinkList q = head;
while (p) {
LinkList newNode = (LinkList)malloc(sizeof(LNode));
newNode->data = p->data;
newNode->next = NULL;
q->next = newNode;
q = q->next;
p = p->next;
}
return head;
}
// 求集合A和B的差集C
LinkList difference(LinkList A, LinkList B)
{
LinkList C = (LinkList)malloc(sizeof(LNode));
C->next = NULL;
LinkList p = A->next;
while (p) {
int flag = 1;
LinkList q = B->next;
while (q) {
if (p->data == q->data) {
flag = 0;
break;
}
q = q->next;
}
if (flag) {
LinkList newNode = (LinkList)malloc(sizeof(LNode));
newNode->data = p->data;
newNode->next = NULL;
LinkList r = C;
while (r->next)
r = r->next;
r->next = newNode;
}
p = p->next;
}
return C;
}
void displayLinkList(LinkList head)
{
LNode *p;
int i=0;
p=head->next;
while(p)
{
printf("%d ",p->data);
p=p->next;
}
}
int main()
{
int n,m;
LinkList A,B,C;
scanf("%d",&n);
A=createLinkList(n);
scanf("%d",&m);
B=createLinkList(m);
C=difference(A,B);
displayLinkList(C);
return 0;
}