您好,欢迎来到刀刀网。
搜索
您的当前位置:首页集合的交集(单链表)

集合的交集(单链表)

来源:刀刀网

题目:用带头结点的单链表表示字符集合,用基本操作实现字符集合的交集(以第二个集合为主)。请先实现单链表的基本操作。

裁判测试程序样例:

#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);
    }
}

 

在这之前遇到了段错误,最后发现是自己链表销毁的地方发生错误。。。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- gamedaodao.com 版权所有 湘ICP备2022005869号-6

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务