#include<stdio.h>
#include <stdlib.h>
typedef char ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
} LNode, *LinkList;
/* 你的程序将嵌在这里 */
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef char Status;
Status InitList(LinkList &L)
{
L=(LinkList)malloc(sizeof(LNode));//生成头结点
if(!L)
return ERROR;//生成头结点失败
L->next=NULL;
return OK;
}
Status ListInsert(LinkList &L,int i,ElemType e)
{
LinkList p,s;
p=L;
int j=0;
while(p&&j<i-1)
{
j++;
p=p->next;
}
if(!p||j>i-1)
{
return ERROR;
}
//生成新的结点
s=(LinkList)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;//插入结点
p->next=s;
return OK;
}
Status ListLength(LinkList L)
{
//带头结点
LinkList p;
int len=0;
p=L->next;
while(p)
{
len++;
p=p->next;
}
return len;
}
Status GetElem(LinkList L,int i,ElemType &e)
{
LinkList p;
p=L->next;
int j=1;
//找到第i个结点
while(p&&j<i)
{
p=p->next;
j++;
}
if(!p||j>i)
return ERROR;
e=p->data;
return OK;
}
Status DestroyList(LinkList &L)
{
LinkList p,temp;
p=L->next;
while(p)
{
temp=p->next;
free(p);
p=temp;
}
//L=NULL;
return OK;
}
void jiaoji(LinkList La,LinkList Lb,LinkList &Lc)
{
InitList(Lc);
LinkList pa,pb,pc,p;
pa=La->next;
pb=Lb->next;
p=pc=Lc;
//p->next=NULL;
while(pb!=NULL)
{
while(pa!=NULL)
{
if(pa->data==pb->data)
{
pc=(LinkList)malloc(sizeof(LNode));//新的存储空间;
pc->data=pb->data;
pc->next=NULL;
p->next=pc;
p=pc;
//printf("%c",pc->data);
break;
}
pa=pa->next;
}
pb=pb->next;
pa=La->next;
}
}
int main()
{
int i,j,len;
ElemType e;
LinkList La,Lb,Lc;
int m,n; //分别存放两个集合初始长度
scanf("%d%d",&m,&n);
getchar();
InitList(La);
InitList(Lb); //建立两个空集
for(i=1; i<=m; i++) //建立第一个集合
{
scanf("%c",&e);
ListInsert(La,i,e);
}
getchar();
for(i=1; i<=n; i++) //建立第二个集合
{
scanf("%c",&e);
ListInsert(Lb,i,e);
}
jiaoji(La,Lb,Lc); //计算集合La、Lb的交集Lc
//输出结果
len=ListLength(Lc);
for(i=1; i<=len; i++)
{
GetElem(Lc,i,e);
printf("%c",e);
}
//printf("\n");
DestroyList(La);
DestroyList(Lb);
DestroyList(Lc); //销毁3个集合
return 0;
}
单链表-集合的交集
最新推荐文章于 2022-10-21 16:18:14 发布