Souka2 发表于 2022-9-18 16:55:15

关于*&L的错误求助

#include <stdio.h>
#include <stdlib.h>
#define MaxSize 50
typedef struct
{
    int date;
    int length;

} Sqlist;
void CreatList(Sqlist *s)
{
    int n, len, i;
    scanf("%d", &n);
    for (i = 0; n != -1; i++)
    {
      s->date = n;
      len++;
      scanf("%d", &n);
    }
    s->length = len;
}
void UnionList(Sqlist *LA, Sqlist *LB, Sqlist *&LC)
{
    int i = 0, j = 0, k = 0;
    LC = (Sqlist *)malloc(sizeof(Sqlist));
    while (i < LA->length && i < LB->length)
    {
      if (LA->date < LB->date)
      {
            LC->date = LA->date;
            i++;
            k++;
      }
      else
      {
            LC->date = LB->date;
      }
    }
    while (i < LA->length)
    {
      LC->date = LA->date;
      i++;
      k++;
    }
    while (j < LB->length)
    {
      LC->date = LB->date;
      j++;
      k++;
    }
    LC->length = k;
}
void print(Sqlist *L)
{
    int i;
    if (L->length == 0)
      return;
    for (i = 0; i < L->length; i++)
    {
      printf("%d ", L->date);
    }
    printf("\n");
}
int main()
{
    Sqlist LA, LB, LC;
    CreatList(&LA);
    CreatList(&LB);
    print(&LA);
    print(&LB);
    UnionList(&LA,&LB,&LC);      //此处报错 报错信息:非常量引用的初始值必须为左值
    print(&LC);
    return 0;
}

Souka2 发表于 2022-9-18 17:01:35

为啥会报错 是我用法不对吗

桃花飞舞 发表于 2022-9-18 23:47:22

本帖最后由 桃花飞舞 于 2022-9-18 23:53 编辑

void UnionList(Sqlist *LA, Sqlist *LB, Sqlist *&LC), 函数 中Sqlist *&LC 应该是个变量。调用时 UnionList(&LA,&LB,&LC); 你的LC传的是地址,猜测改成void UnionList(Sqlist *LA, Sqlist *LB, Sqlist *LC);这样就可以了。

Souka2 发表于 2022-9-19 10:29:57

桃花飞舞 发表于 2022-9-18 23:47
void UnionList(Sqlist *LA, Sqlist *LB, Sqlist *&LC), 函数 中Sqlist *&LC 应该是个变量。调用时 Union ...

但是这样不就没办法改变LC了吗

lqhenwunai 发表于 2022-9-19 10:53:24

本帖最后由 lqhenwunai 于 2022-9-19 10:54 编辑

void UnionList(Sqlist *LA, Sqlist *LB, Sqlist *&LC)

LC前多了一个&

桃花飞舞 发表于 2022-9-19 11:13:52

本帖最后由 桃花飞舞 于 2022-9-19 11:16 编辑

Souka2 发表于 2022-9-19 10:29
但是这样不就没办法改变LC了吗

具体我也看不出来你想干什么,要不你把题目要求说一下?只是Sqlist *&LC 这样形参是结构体类型变量,UnionList(&LA,&LB,&LC);这里实参的&LC是结构体类型的指针。语法上肯定会出错。void CreatList(Sqlist *s)这个函数里面没 有malloc空间,我不知道数据你放到哪里了?void UnionList(Sqlist *LA, Sqlist *LB, Sqlist *&LC)里面LC = (Sqlist *)malloc(sizeof(Sqlist));空间分配也不够吧,这里的LC是指针,你把LC返回,并在main函数里面用结构体指针接收可以改变主函数的指针。总之你只是说报错了只要语法改对不就可以了?

Souka2 发表于 2022-9-19 14:26:10

桃花飞舞 发表于 2022-9-19 11:13
具体我也看不出来你想干什么,要不你把题目要求说一下?只是Sqlist *&LC 这样形参是结构体类型变量,Un ...

设计一个有序顺序表,即表中的数据元素按数据元素值递增有序。实现以下函数:
(a)合并两个有序表,得到一个新的有序表。
(b)求两个有序表的中位数。当有序表表长L为奇数时,中位数的位序为L/2+1,L为偶数时,中位数位序为L/2。
举例:顺序表,L=7,中位数为5。

桃花飞舞 发表于 2022-9-19 16:27:33

本帖最后由 桃花飞舞 于 2022-9-19 16:39 编辑

Souka2 发表于 2022-9-19 14:26
设计一个有序顺序表,即表中的数据元素按数据元素值递增有序。实现以下函数:
(a)合并两个有序表,得 ...

我百度了一个C语言的代码,可以解决(a)这个问题,不过它的代码有无序表部分。(b)这个问题用数组我可以解。链表我也没做过。
#include<stdio.h>
#include<stdlib.h>

#define OK 1
#define OVERFLOW 0
#define LIST_INIT_SIZE 10
#define LISTINCREMENT 5

typedef struct{
        int *elem;
        int length;
        int listsize;
}Sqlist;

//初始化顺序表
int InitList(Sqlist *l){
        l->elem = (int *)malloc(LIST_INIT_SIZE*sizeof(int));
        if(!l->elem){
                printf("存储空间分配失败!\n");
                exit(OVERFLOW);
        }
        l->length = 0;
        l->listsize = LIST_INIT_SIZE;
        return OK;
}
//给顺序表赋值
int CreatList(Sqlist *l,int length){
        printf("请输入元素:\n");
        for(int i=0;i<length;i++) scanf("%d",l->elem+i);
        l->length = length;
        return OK;
}
//输出顺序表中的元素
void PrintList(Sqlist *l){
        printf("输出结果为:\n");
        for(int i=0;i<l->length;i++) printf("%d ",l->elem);
        printf("\n");
}

//得到线性表某位置上的元素
int GetElem(Sqlist *l,int i,int *p){
        if(i<1||i>l->length){
                printf("位置错误!\n");
                exit(OVERFLOW);
        }
        *p = l->elem;
        return OK;
}

int ListInsert(Sqlist *l,int i,int e){//i是第几个
        if(i<1||i>l->length+1){
                printf("插入位置有误!\n");
                exit(OVERFLOW);
        }
        if(l->length==l->listsize){
                int *newbase;
                newbase = (int *)realloc(l->elem,(l->listsize+LISTINCREMENT)*sizeof(int));
                if(!newbase){
                        printf("存储空间分配失败!\n");
                        exit(OVERFLOW);
                }
                l->elem = newbase;
                l->listsize += LISTINCREMENT;
        }
        l->elem = e;
        l->length++;
        return OK;
}

//是否需要增加分配空间
int IncreaseList(Sqlist *l,int length){
        if(length>l->listsize){
                int *newbase;
                newbase = (int *)realloc(l->elem,(l->listsize+LISTINCREMENT)*sizeof(int));
                if(!newbase){
                        printf("存储空间分配失败!\n");
                        exit(OVERFLOW);
                }
                l->elem = newbase;
                l->listsize += LISTINCREMENT;
        }
        return OK;
}

//将两个无序顺序表连接起来
int UnionWx(Sqlist *a,Sqlist b){
        int a_length = a->length,b_length = b.length;
        for(int i=0;i<b_length;i++){//这里的i是下标 GetElem()里的i是位置
                int num,flag = 0;
                GetElem(&b,i+1,&num);
                for(int j=0;j<a_length;j++){
                        if(num==a->elem) {
                                flag = 1;//在a顺序表里找到了相同的元素
                                break;
                        }
                }
                if(!flag) ListInsert(a,++a_length,num);
        }
        return OK;
}

//将两个有序顺序表连接起来
int UnionYx(Sqlist *a,Sqlist *b,Sqlist *c){
        int *pa,*pb,*pc,*pa_last,*pb_last;
       
        pa = a->elem; pb = b->elem; pa_last = pa+a->length-1; pb_last = pb+b->length-1;
        c->length = a->length+b->length;//C顺序表示要存储a b两个表中的数据的 所以存储空间应该是二者的和 由此来申请C的存储空间
        c->listsize = c->length;
       
        c->elem = (int *)malloc(c->listsize*sizeof(int));
        if(!c->elem){
                printf("合并后的顺序表申请内存失败!\n");
                exit(OVERFLOW);
        }
        pc = c->elem;
       
        while(pa<=pa_last&&pb<=pb_last){//归并
                if(*pa<=*pb){
                        *pc++ = *pa++;
                }       
                else{
                        *pc++ = *pb++;
                }
        }
       
        while(pa<=pa_last) *pc++ = *pa++;//插入顺序表a剩下的元素
        while(pb<=pb_last) *pc++ = *pb++;//插入顺序表b剩下的元素
       
        return OK;
}


main(){
        int a_length,b_length;
        Sqlist a,b,c;
       
        InitList(&a);
        printf("第一个顺序表你想输入多少个元素?\n");
        scanf("%d",&a_length);
        IncreaseList(&a,a_length);//是否需要增加分配空间
        CreatList(&a,a_length);
        PrintList(&a);
       
        InitList(&b);
        printf("\n第二个顺序表你想输入多少个元素?\n");
        scanf("%d",&b_length);
        IncreaseList(&b,b_length);//是否需要增加分配空间
        CreatList(&b,b_length);
        PrintList(&b);
        printf("合并后");
//无序顺序表的合并       
        UnionWx(&a,b);
        PrintList(&a);
//有序线性表的合并
//        UnionYx(&a,&b,&c);
//        PrintList(&c);
}
页: [1]
查看完整版本: 关于*&L的错误求助