AC_wy 2023-03-24 19:54 采纳率: 83.3%
浏览 107
已结题

c语言求两个集合的合并运算

输出错误,不晓得哪个函数出错了,验证过Union函数没有错误


#include<stdio.h>
#include<string.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 20
typedef int Status;
typedef int ElemType;
typedef struct
{
    ElemType data[MAXSIZE];   /*存储数组元素*/
    int length;               /*表当前有效长度*/ 
}SqList;/*数组存储类型名*/ 
int ListLength(SqList L);
Status GetElem(SqList L,int i,ElemType *e);
int LocateElem(SqList L,ElemType e,int compare(ElemType x,ElemType y));
int compare(ElemType x,ElemType y);
Status ListInsert(SqList *L,ElemType i,ElemType e);
Status  ListEmpty(SqList L);
void Union(SqList *La,SqList Lb);

int main()
{
    int i; 
    char ch;
    SqList La,Lb;
    La.length=0;
    Lb.length=0;
    for(i=0;;i++)
    {
        scanf("%d%c",&La.data[i],&ch);
        La.length++;
        if(ch=='\n')
            break;
    }
    for(i=0;;i++)
    {
        scanf("%d%c",&Lb.data[i],&ch);
        Lb.length++;
        if(ch=='\n')
            break;
    }
    if(!ListEmpty(La)&&!ListEmpty(Lb))
        Union(&La,Lb);
    for(i=0;i<La.length;i++)
        printf("%d ",La.data[i]);
    return 0;
}

/*返回L中数据元素个数*/
int ListLength(SqList L)
{
    return L.length;
} 

/*用e返回L中第i个数据元素的值*/
Status GetElem(SqList L,int i,ElemType *e)
{
    if(L.length==0||i<1||i>L.length)
        return ERROR;
    *e=L.data[i-1];
    return OK;
} 

/*返回L中第1个与e满足关系compare()的数据元素的位序。若这样的数据元素不存在,则返回值为0*/
int LocateElem(SqList L,ElemType e,int compare(ElemType x,ElemType y))
{
    int i;
    for(i=0;i<L.length;i++)
    {
        if(compare(L.data[i],e))
            return i+1;
    }
    return 0;
} 

int compare(ElemType x,ElemType y)
{
    if(x==y)
        return 1;
    else
        return 0;
}

/*L中第i个位置之前插入新的数据元素e,L的长度+1*/
Status ListInsert(SqList *L,ElemType i,ElemType e)
{
    int k;
    if(i==L->length)
        L->data[i]=e;
    else
    {
        for(k=L->length-1;k>=i-1;k--)
        {
            L->data[k+1]=L->data[k];
        }
        L->data[i-1]=e;
    }
    L->length++;
} 

/*L为空表,则返回TRUE,否则返回FALSE*/
Status  ListEmpty(SqList L)
{
    if(L.length==0)
        return TRUE;
    else
        return FALSE;
}

/*将所有在表Lb中但不在表La中的数据元素插入到La*/
void Union(SqList *La,SqList Lb)
{
    ElemType e;
    int La_len,Lb_len;
    int i;
    La_len=ListLength(*La);   /*La长度*/
    Lb_len=ListLength(Lb);   /*Lb长度*/ 
    for(i=1;i<=Lb_len;i++)
    {
        GetElem(Lb,i,&e);
        if(!LocateElem(*La,i,compare))    /*La中不存在和e相同的元素,则插入之*/ 
            ListInsert(La,++La_len,e);
    }
}  

  • 写回答

3条回答 默认 最新

  • hackferances 2023-03-24 20:18
    关注

    在Union函数中,使用了错误的参数来调用LocateElem函数。在代码中,你调用了LocateElem(*La, i, compare),其中i是Lb中的元素位置,而不是元素值。因此,LocateElem无法正确地找到相应的元素。

    要修复此问题,请更改代码中的ListInsert语句:

    if(!LocateElem(*La,e,compare))    /*若La中不存在和e相同的元素,则插入之*/ 
        ListInsert(La,++La_len,e);
    
    
    

    这里将查找的元素从i更改为e,这样就可以正确地找到Lb中的元素,并将其添加到La中。

    另外还有一个小问题:在ListInsert函数中,如果i等于L->length,插入的元素会覆盖最后一个元素。要解决此问题,请将if语句中的等号去掉:

    if(i == L->length)
        L->data[i] = e;
    
    
    

    应该变成:

    if(i == L->length + 1)
        L->data[i - 1] = e;
    
    
    

    这样可以确保新元素始终插入到表末尾。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月26日
  • 已采纳回答 3月24日
  • 创建了问题 3月24日

悬赏问题

  • ¥15 不小心不正规的开发公司导致不给我们y码,
  • ¥15 我的代码无法在vc++中运行呀,错误很多
  • ¥50 求一个win系统下运行的可自动抓取arm64架构deb安装包和其依赖包的软件。
  • ¥60 fail to initialize keyboard hotkeys through kernel.0000000000
  • ¥30 ppOCRLabel导出识别结果失败
  • ¥15 Centos7 / PETGEM
  • ¥15 csmar数据进行spss描述性统计分析
  • ¥15 各位请问平行检验趋势图这样要怎么调整?说标准差差异太大了
  • ¥15 delphi webbrowser组件网页下拉菜单自动选择问题
  • ¥15 wpf界面一直接收PLC给过来的信号,导致UI界面操作起来会卡顿