集合的交运算(单链表)
- 总时间限制:
- 1000ms 内存限制:
- 65536kb
- 描述
利用两个单链表LA和LB分别表示两个集合A和B(即线性表中的数据元素即为集合中的成员),要求一个新的集合A=A
∩B。这就要求对链表作如下操作:将存在于表LA中,同时又存在于LB中的数据元素保留,将LA中其他元素删除。
例如:输入8个整数:3 6 7 12 14 8 9 2,建立链表LA;再输入10个整数:8 9 5 21 22 18 29 25 80 12,建立链表LB;则做集合的交运算后,LA变为:12 8 9
要求:必须使用链表,程序中必须有链表的相关操作:初始化、插入、删除、输出链表中元素、销毁。不满足要求的程序即使通过,也会算作0分。
输入- 输入包含3行:
第一行是两个整数n和m(1 <= n,m <= 200),用空格分隔,分别代表集合A和B的元素个数。
第二行包含n个整数。每个整数之间用空格分隔;每个整数的取值在32位有符号整数范围以内。代表集合A的元素。
第三行包含m个整数。每个整数之间用空格分隔;每个整数的取值在32位有符号整数范围以内。代表集合B的元素。 输出 - 输出只有1行:
按输入时的顺序输出交集中元素的值,每元素之间用空格分隔。 样例输入 8 103 6 7 12 14 8 9 28 9 5 21 22 14 29 25 80 12
样例输出9 8 12
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 20
typedef int Status;
typedef int ElemType;
typedef struct Node
{
ElemType data;
struct Node *next;
} Node;
typedef struct Node *LinkList;
Status InitList(LinkList *L);//初始化链表
Status ListInsert(LinkList *L,int i,ElemType e);//往链表中第i个位置插入数据
Status ListDelete(LinkList *L,int i);//把链表中第i个位置的数据删除
Status visit(ElemType c)
{
printf("%d ",c);
return OK;
}
int LocateElem(LinkList L,ElemType e)
{
int i=0;
LinkList p=L->next;
while(p)
{
i++;
if(p->data==e) /* 找到这样的数据元素 */
return i;
p=p->next;
}
return 0;
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
LinkList la,lb,lc;//定义链表la,lb,lc
InitList(&la);//初始化链表
InitList(&lb);
InitList(&lc);
for(int i=1;i<=n;i++)//往链表中插入数据
{
int x;
scanf("%d",&x);
ListInsert(&la,i,x);
}
for(int i=1;i<=m;i++)
{
int x;
scanf("%d",&x);
ListInsert(&lb,i,x);
}
LinkList p=la->next;
LinkList q=lb->next;
while(p)
{
int x=0;
q=lb->next;
while(q)
{
if(p->data==q->data)
{
x=1;
ListInsert(&lc,1,p->data);
}
q=q->next;
}
p=p->next;
}
LinkList pp = lc->next;
while(pp)
{
printf("%d ",pp->data);
pp=pp->next;
}
return 0;
}
Status InitList(LinkList *L)
{
*L=(LinkList)malloc(sizeof(Node));
if(!(*L))
return ERROR;
(*L)->next=NULL;
return OK;
}
Status ListInsert(LinkList *L,int i,ElemType e)
{
int j;
LinkList p,s;
p = *L;
j = 1;
while(p && j < i)
{
p = p->next;
++j;
}
if( !p || j > i)
return ERROR;
s = (LinkList)malloc(sizeof(Node));
s->data = e;
s->next = p->next;
p->next = s;
return OK;
}
Status ListDelete(LinkList *L,int i)
{
int j;
LinkList p,q;
p = *L;
j = 1;
while(p->next && j < i)
{
p = p->next;
++j;
}
if(!(p->next) || j > i)
return ERROR;
q = p->next;
p->next=q->next;
free(q);
return OK;
}
765



被折叠的 条评论
为什么被折叠?



