33,321
社区成员




#include<stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;
typedef char ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
} LNode, *LinkList;
/* 你的程序将嵌在这里 */
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;
while(p)
{
len++;
p=p->next;
}
return OK;
}
Status GetElem(LinkList L,int i,ElemType &e)
{
LinkList p;
p=L;
int j=0;
//找到第i-1个结点
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;
while(p)
{
temp=p;
p=p->next;
free(temp);
}
p->next=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;
while(pa!=NULL)
{
while(pb!=NULL)
{
if(pa->data==pb->data)
{
pc=(LinkList)malloc(sizeof(LNode));//新的存储空间;
pc->data=pa->data;
pc->next=NULL;
p->next=pc;
p=pc;
}
pb=pb->next;
}
pa=pa->next;
pb=Lb->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;
}
//3 5
//abc
//decbf
Status ListLength(LinkList L, int *len) //这里
{
//带头结点
LinkList p;
//int len=0;
p=L->next; //这里,主要是因为你的链表开头都有个空元素,所以这里略过开头的计数
while(p)
{
(*len)++; //这里
p=p->next;
}
return OK;
}
相应的,main要修改
//输出结果
len=0; //这里
ListLength(Lc, &len); //这里
for(i=1; i<=len; i++)
{
GetElem(Lc,i,e);
printf("%c",e);
}
另外,你释放内存也有问题
Status DestroyList(LinkList &L)
{
LinkList p,temp;
p=L;
while(p) //这里p是NULL才退出循环
{
temp=p;
p=p->next;
free(temp);
}
//p->next=NULL; //所以这里p为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;
}