题目:用带头结点的单链表表示字符集合,用基本操作实现字符集合的交集(以第二个集合为主)。请先实现单链表的基本操作。
裁判测试程序样例:
#include<stdio.h>
#include <stdlib.h>
typedef char ElemType;
typedef struct LNode
{ ElemType data;
struct LNode *next;
}LNode, *LinkList;
/* 你的程序将嵌在这里 */
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;
}
正确答案:
#define OVERFLOW -2
void InitList(LinkList &L)
{
L=NULL;
}
int ListLength(LinkList &L)
{
LinkList p;
p=L;
int i=0;
while(p)
{
i++;
p=p->next;
}
return i;
}
void GetElem(LinkList &L,int i,ElemType &e)
{
LinkList p;
p=L;
int j=1;
while(p&&j<i)
{
j++;
p=p->next;
}
e=p->data;
}
int ListInsert(LinkList &L,int i,ElemType e)
{
LinkList p,s;
p=L;
int j=1;
while(j<i-1)
{
p=p->next;
++j;
}
s=(LNode*)malloc(sizeof(LNode));
s->data=e;
s->next=NULL;
if(i==1)
{
L=s;
}
else{
p->next=s;}
return 1;
}
int LocateElem(LinkList &L,ElemType e,int (*compare)(ElemType,ElemType))
{
LinkList p;
p=L;
while(p&&!(*compare)(p->data,e))
{
p=p->next;
}
if(p==NULL)return 0;
else return 1;
}
int equal(ElemType x,ElemType y)
{
if(x==y)return 1;
else return 0;
}
void jiaoji(LinkList &La,LinkList &Lb,LinkList &Lc)
{
int k=0;
InitList(Lc);
LinkList p;
p=Lb;
while(p)
{
if(LocateElem(La,p->data,equal))
{
ListInsert(Lc,++k,p->data);
}
p=p->next;
}
}
void DestroyList(LinkList &L)
{
LinkList p,q;
/*p=L;
while(p)
{
q=p->next;
free(p);
p=q;
}
free(q);*/
while(L!=NULL)
{
p=L;
L=L->next;
free(p);
}
}
在这之前遇到了段错误,最后发现是自己链表销毁的地方发生错误。。。