Fridayup 2022-09-18 13:54 采纳率: 87.5%
浏览 32
已结题

合并顺序表问题 望指导

合并顺序表(不含重复) 不知道为什么最后合并的顺序表LA为空表

#include<stdio.h>
#define MAXSIZE 100
//定义顺序表
typedef struct{
    int *elem;
    int length;
}SqList; 
//初始化顺序表
int InitList(SqList &L){
    L.elem=new int [MAXSIZE];  //分配一个长度为MAXSIZE的数组 
    if(!L.elem) return 0;      //分配失败退出 
    L.length=0;                //空表
    return 1; 
} 
//输入值 
int ListOutput(SqList &L,int n){
    int i;
    for(i=0;i<n;i++){
        scanf("%d",&L.elem[i]);
        L.length++; 
    }
    return 1;
} 
//取值
int GetElem(SqList L,int i,int &e){
    if(i<1||i>L.length){
        printf("位置有错\n");
        return 0;
    }
    e=L.elem[i-1];
    return 1;
}
//输出顺序表
int ShowList(SqList &L){
    int i;
    if(L.length==0){
        printf("表为空\n");
        return 0;
    }
    printf("该顺序表元素有:\n");
    for(i=0;i<L.length;i++){
        printf("%d ",L.elem[i]);
    }
    printf("\n");
    return 1;
}
//插入
int ListInsert(SqList &L,int i,int e){
    if((i<1)||(i>L.length+1))  return 0;
    if(L.length==MAXSIZE) return 0;
    for(int j=L.length-1;j>=i-1;j--){
        L.elem[j+1]=L.elem[j]; 
    }
    L.elem[i-1]=e;
    L.length++;
    return 0;
}
//合并 
int MergeList_Sq(SqList LA, SqList LB){
    int a_len=LA.length,b_len=LB.length;
    for(int i=0;i<b_len;i++){
        int num,flag=0;
        GetElem(LB,i+1,num);
        for(int j=0;j<a_len;j++){
            if(num==LA.elem[j]){
                flag=1; 
                break;
            }
        }
        if(flag==0){
             ListInsert(LA,a_len++,num);
        }
   }
   return 1; 
} 
int main(){
    SqList LA,LB;
    int a,b;
    
    printf("请输入想要输入LA的元素个数:\n");
    scanf("%d",&a);
    printf("请输入想要输入LA的元素:\n");
    ListOutput(LA,a);
    InitList(LA);[](
    
    printf("请输入想要输入LB的元素个数:\n");
    scanf("%d",&b);
    printf("请输入想要输入LB的元素:\n");
    InitList(LB);
    ListOutput(LB,b);
    
    
    MergeList_Sq(LA,LB);
    print("合并后的LA为:\n"); 
    ShowList(LA);
    
    return 0;
} 
不知道 LA为什么是空表

展开全部

  • 写回答

2条回答 默认 最新

  • qzjhjxj 2022-09-18 16:53
    关注

    修改处见注释,供参考:

    #include<stdio.h>
    #define MAXSIZE 100
    //定义顺序表
    typedef struct{
        int *elem;
        int length;
    }SqList;
    //初始化顺序表
    int InitList(SqList &L){
        L.elem=new int [MAXSIZE];  //分配一个长度为MAXSIZE的数组
        if(!L.elem) return 0;      //分配失败退出
        L.length=0;                //空表
        return 1;
    }
    //输入值
    int ListOutput(SqList &L,int n){
        int i;
        for(i=0;i<n;i++){
            scanf("%d",&L.elem[i]);
            L.length++; 
        }
        return 1;
    }
    //取值
    int GetElem(SqList L,int i,int &e){
        if(i<1||i>L.length){
            printf("位置有错\n");
            return 0;
        }
        e=L.elem[i-1];
        return 1;
    }
    //输出顺序表
    int ShowList(SqList &L){
        int i;
        if(L.length==0){
            printf("表为空\n");
            return 0;
        }
        printf("该顺序表元素有:\n");
        for(i=0;i<L.length;i++){
            printf("%d ",L.elem[i]);
        }
        printf("\n");
        return 1;
    }
    //插入
    int ListInsert(SqList &L,int i,int e){
        if((i<1)||(i>L.length+1))  return 0;
        if(L.length==MAXSIZE) return 0;
        for(int j=L.length-1;j>=i-1;j--){
            L.elem[j+1]=L.elem[j]; 
        }
        L.elem[i-1]=e;
        L.length++;
        return 0;
    }
    //合并 
    int MergeList_Sq(SqList &LA, SqList LB){ //(SqList LA, SqList LB) 修改
        int a_len=LA.length,b_len=LB.length;
        for(int i=0;i<b_len;i++){
            a_len=LA.length;    //修改
            int num,flag=0;
            GetElem(LB,i+1,num);
            for(int j=0;j<a_len;j++){
                if(num==LA.elem[j]){
                    flag=1;
                    break;
                }
            }
            if(flag==0){
                 ListInsert(LA,a_len+1,num); //(LA,a_len++,num); 修改
            }
       }
       return 1; 
    } 
    int main(){
        SqList LA,LB;
        int a,b;
        
        printf("请输入想要输入LA的元素个数:\n");
        scanf("%d",&a);
        printf("请输入想要输入LA的元素:\n");
        InitList(LA);//[](    修改
        ListOutput(LA,a);  // 修改
    
        printf("请输入想要输入LB的元素个数:\n");
        scanf("%d",&b);
        printf("请输入想要输入LB的元素:\n");
        InitList(LB);
        ListOutput(LB,b);
        
        
        MergeList_Sq(LA,LB);
        printf("合并后的LA为:\n"); //修改 print();
        ShowList(LA);
        return 0;
    } 
    //不知道 LA为什么是空表
    
    

    展开全部

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
    Fridayup 2022-09-19 12:00

    谢谢😊

    回复
    Fridayup 2022-09-19 12:01

    为啥 在合并的函数当中 第一行 LA前面要有& 而LB前面没有😢

    回复
    qzjhjxj 回复 Fridayup 2022-09-19 12:51

    因为int MergeList_Sq(SqList &LA, SqList LB) 合并函数里,是需要合并到顺序表LA ,需要写入操作,所以形参用了引用&LA ,相当于地址操作。 而LB只用到了取它的值,所以只要值传递就可以了。

    回复
    展开全部4条评论
查看更多回答(1条)
编辑
预览

报告相同问题?

问题事件

  • 系统已结题 9月26日
  • 已采纳回答 9月19日
  • 创建了问题 9月18日
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部