鱼C论坛

 找回密码
 立即注册
查看: 1536|回复: 7

[已解决]关于*&L的错误求助

[复制链接]
发表于 2022-9-18 16:55:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

} Sqlist;
void CreatList(Sqlist *s)
{
    int n, len, i;
    scanf("%d", &n);
    for (i = 0; n != -1; i++)
    {
        s->date[i] = 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[i] < LB->date[i])
        {
            LC->date[k] = LA->date[i];
            i++;
            k++;
        }
        else
        {
            LC->date[k] = LB->date[j];
        }
    }
    while (i < LA->length)
    {
        LC->date[k] = LA->date[i];
        i++;
        k++;
    }
    while (j < LB->length)
    {
        LC->date[k] = LB->date[j];
        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[i]);
    }
    printf("\n");
}
int main()
{
    Sqlist LA, LB, LC;
    CreatList(&LA);
    CreatList(&LB);
    print(&LA);
    print(&LB);
    UnionList(&LA,&LB,&LC);      //此处报错 报错信息:非常量引用的初始值必须为左值
    print(&LC);
    return 0;
}
最佳答案
2022-9-19 16:27:33
本帖最后由 桃花飞舞 于 2022-9-19 16:39 编辑
Souka2 发表于 2022-9-19 14:26
设计一个有序顺序表,即表中的数据元素按数据元素值递增有序。实现以下函数:
(a)合并两个有序表,得 ...


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

  3. #define OK 1
  4. #define OVERFLOW 0
  5. #define LIST_INIT_SIZE 10
  6. #define LISTINCREMENT 5

  7. typedef struct{
  8.         int *elem;
  9.         int length;
  10.         int listsize;
  11. }Sqlist;

  12. //初始化顺序表
  13. int InitList(Sqlist *l){
  14.         l->elem = (int *)malloc(LIST_INIT_SIZE*sizeof(int));
  15.         if(!l->elem){
  16.                 printf("存储空间分配失败!\n");
  17.                 exit(OVERFLOW);
  18.         }
  19.         l->length = 0;
  20.         l->listsize = LIST_INIT_SIZE;
  21.         return OK;
  22. }
  23. //给顺序表赋值
  24. int CreatList(Sqlist *l,int length){
  25.         printf("请输入元素:\n");
  26.         for(int i=0;i<length;i++) scanf("%d",l->elem+i);
  27.         l->length = length;
  28.         return OK;
  29. }
  30. //输出顺序表中的元素
  31. void PrintList(Sqlist *l){
  32.         printf("输出结果为:\n");
  33.         for(int i=0;i<l->length;i++) printf("%d ",l->elem[i]);
  34.         printf("\n");
  35. }

  36. //得到线性表某位置上的元素
  37. int GetElem(Sqlist *l,int i,int *p){
  38.         if(i<1||i>l->length){
  39.                 printf("位置错误!\n");
  40.                 exit(OVERFLOW);
  41.         }
  42.         *p = l->elem[i-1];
  43.         return OK;
  44. }

  45. int ListInsert(Sqlist *l,int i,int e){//i是第几个
  46.         if(i<1||i>l->length+1){
  47.                 printf("插入位置有误!\n");
  48.                 exit(OVERFLOW);
  49.         }
  50.         if(l->length==l->listsize){
  51.                 int *newbase;
  52.                 newbase = (int *)realloc(l->elem,(l->listsize+LISTINCREMENT)*sizeof(int));
  53.                 if(!newbase){
  54.                         printf("存储空间分配失败!\n");
  55.                         exit(OVERFLOW);
  56.                 }
  57.                 l->elem = newbase;
  58.                 l->listsize += LISTINCREMENT;
  59.         }
  60.         l->elem[i-1] = e;
  61.         l->length++;
  62.         return OK;
  63. }

  64. //是否需要增加分配空间
  65. int IncreaseList(Sqlist *l,int length){
  66.         if(length>l->listsize){
  67.                 int *newbase;
  68.                 newbase = (int *)realloc(l->elem,(l->listsize+LISTINCREMENT)*sizeof(int));
  69.                 if(!newbase){
  70.                         printf("存储空间分配失败!\n");
  71.                         exit(OVERFLOW);
  72.                 }
  73.                 l->elem = newbase;
  74.                 l->listsize += LISTINCREMENT;
  75.         }
  76.         return OK;
  77. }

  78. //将两个无序顺序表连接起来
  79. int UnionWx(Sqlist *a,Sqlist b){
  80.         int a_length = a->length,b_length = b.length;
  81.         for(int i=0;i<b_length;i++){//这里的i是下标 GetElem()里的i是位置
  82.                 int num,flag = 0;
  83.                 GetElem(&b,i+1,&num);
  84.                 for(int j=0;j<a_length;j++){
  85.                         if(num==a->elem[j]) {
  86.                                 flag = 1;//在a顺序表里找到了相同的元素
  87.                                 break;
  88.                         }
  89.                 }
  90.                 if(!flag) ListInsert(a,++a_length,num);
  91.         }
  92.         return OK;
  93. }

  94. //将两个有序顺序表连接起来
  95. int UnionYx(Sqlist *a,Sqlist *b,Sqlist *c){
  96.         int *pa,*pb,*pc,*pa_last,*pb_last;
  97.        
  98.         pa = a->elem; pb = b->elem; pa_last = pa+a->length-1; pb_last = pb+b->length-1;
  99.         c->length = a->length+b->length;//C顺序表示要存储a b两个表中的数据的 所以存储空间应该是二者的和 由此来申请C的存储空间
  100.         c->listsize = c->length;
  101.        
  102.         c->elem = (int *)malloc(c->listsize*sizeof(int));
  103.         if(!c->elem){
  104.                 printf("合并后的顺序表申请内存失败!\n");
  105.                 exit(OVERFLOW);
  106.         }
  107.         pc = c->elem;
  108.        
  109.         while(pa<=pa_last&&pb<=pb_last){//归并
  110.                 if(*pa<=*pb){
  111.                         *pc++ = *pa++;
  112.                 }       
  113.                 else{
  114.                         *pc++ = *pb++;
  115.                 }
  116.         }
  117.        
  118.         while(pa<=pa_last) *pc++ = *pa++;//插入顺序表a剩下的元素
  119.         while(pb<=pb_last) *pc++ = *pb++;//插入顺序表b剩下的元素
  120.          
  121.         return OK;
  122. }


  123. main(){
  124.         int a_length,b_length;
  125.         Sqlist a,b,c;
  126.        
  127.         InitList(&a);
  128.         printf("第一个顺序表你想输入多少个元素?\n");
  129.         scanf("%d",&a_length);
  130.         IncreaseList(&a,a_length);//是否需要增加分配空间
  131.         CreatList(&a,a_length);
  132.         PrintList(&a);
  133.        
  134.         InitList(&b);
  135.         printf("\n第二个顺序表你想输入多少个元素?\n");
  136.         scanf("%d",&b_length);
  137.         IncreaseList(&b,b_length);//是否需要增加分配空间
  138.         CreatList(&b,b_length);
  139.         PrintList(&b);
  140.         printf("合并后");
  141. //无序顺序表的合并       
  142.         UnionWx(&a,b);
  143.         PrintList(&a);
  144. //有序线性表的合并
  145. //        UnionYx(&a,&b,&c);
  146. //        PrintList(&c);
  147. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-9-18 17:01:35 | 显示全部楼层
为啥会报错 是我用法不对吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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);这样就可以了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-19 10:29:57 | 显示全部楼层
桃花飞舞 发表于 2022-9-18 23:47
void UnionList(Sqlist *LA, Sqlist *LB, Sqlist *&LC), 函数 中  Sqlist *&LC 应该是个变量。调用时 Union ...

但是这样不就没办法改变LC了吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-19 10:53:24 | 显示全部楼层
本帖最后由 lqhenwunai 于 2022-9-19 10:54 编辑

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

LC前多了一个&
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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函数里面用结构体指针接收可以改变主函数的指针。总之你只是说报错了只要语法改对不就可以了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

设计一个有序顺序表,即表中的数据元素按数据元素值递增有序。实现以下函数:
(a)合并两个有序表,得到一个新的有序表。
(b)求两个有序表的中位数。当有序表表长L为奇数时,中位数的位序为L/2+1,L为偶数时,中位数位序为L/2。
举例:顺序表[1,3,4,5,6,7,8],L=7,中位数为5。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-19 16:27:33 | 显示全部楼层    本楼为最佳答案   
本帖最后由 桃花飞舞 于 2022-9-19 16:39 编辑
Souka2 发表于 2022-9-19 14:26
设计一个有序顺序表,即表中的数据元素按数据元素值递增有序。实现以下函数:
(a)合并两个有序表,得 ...


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

  3. #define OK 1
  4. #define OVERFLOW 0
  5. #define LIST_INIT_SIZE 10
  6. #define LISTINCREMENT 5

  7. typedef struct{
  8.         int *elem;
  9.         int length;
  10.         int listsize;
  11. }Sqlist;

  12. //初始化顺序表
  13. int InitList(Sqlist *l){
  14.         l->elem = (int *)malloc(LIST_INIT_SIZE*sizeof(int));
  15.         if(!l->elem){
  16.                 printf("存储空间分配失败!\n");
  17.                 exit(OVERFLOW);
  18.         }
  19.         l->length = 0;
  20.         l->listsize = LIST_INIT_SIZE;
  21.         return OK;
  22. }
  23. //给顺序表赋值
  24. int CreatList(Sqlist *l,int length){
  25.         printf("请输入元素:\n");
  26.         for(int i=0;i<length;i++) scanf("%d",l->elem+i);
  27.         l->length = length;
  28.         return OK;
  29. }
  30. //输出顺序表中的元素
  31. void PrintList(Sqlist *l){
  32.         printf("输出结果为:\n");
  33.         for(int i=0;i<l->length;i++) printf("%d ",l->elem[i]);
  34.         printf("\n");
  35. }

  36. //得到线性表某位置上的元素
  37. int GetElem(Sqlist *l,int i,int *p){
  38.         if(i<1||i>l->length){
  39.                 printf("位置错误!\n");
  40.                 exit(OVERFLOW);
  41.         }
  42.         *p = l->elem[i-1];
  43.         return OK;
  44. }

  45. int ListInsert(Sqlist *l,int i,int e){//i是第几个
  46.         if(i<1||i>l->length+1){
  47.                 printf("插入位置有误!\n");
  48.                 exit(OVERFLOW);
  49.         }
  50.         if(l->length==l->listsize){
  51.                 int *newbase;
  52.                 newbase = (int *)realloc(l->elem,(l->listsize+LISTINCREMENT)*sizeof(int));
  53.                 if(!newbase){
  54.                         printf("存储空间分配失败!\n");
  55.                         exit(OVERFLOW);
  56.                 }
  57.                 l->elem = newbase;
  58.                 l->listsize += LISTINCREMENT;
  59.         }
  60.         l->elem[i-1] = e;
  61.         l->length++;
  62.         return OK;
  63. }

  64. //是否需要增加分配空间
  65. int IncreaseList(Sqlist *l,int length){
  66.         if(length>l->listsize){
  67.                 int *newbase;
  68.                 newbase = (int *)realloc(l->elem,(l->listsize+LISTINCREMENT)*sizeof(int));
  69.                 if(!newbase){
  70.                         printf("存储空间分配失败!\n");
  71.                         exit(OVERFLOW);
  72.                 }
  73.                 l->elem = newbase;
  74.                 l->listsize += LISTINCREMENT;
  75.         }
  76.         return OK;
  77. }

  78. //将两个无序顺序表连接起来
  79. int UnionWx(Sqlist *a,Sqlist b){
  80.         int a_length = a->length,b_length = b.length;
  81.         for(int i=0;i<b_length;i++){//这里的i是下标 GetElem()里的i是位置
  82.                 int num,flag = 0;
  83.                 GetElem(&b,i+1,&num);
  84.                 for(int j=0;j<a_length;j++){
  85.                         if(num==a->elem[j]) {
  86.                                 flag = 1;//在a顺序表里找到了相同的元素
  87.                                 break;
  88.                         }
  89.                 }
  90.                 if(!flag) ListInsert(a,++a_length,num);
  91.         }
  92.         return OK;
  93. }

  94. //将两个有序顺序表连接起来
  95. int UnionYx(Sqlist *a,Sqlist *b,Sqlist *c){
  96.         int *pa,*pb,*pc,*pa_last,*pb_last;
  97.        
  98.         pa = a->elem; pb = b->elem; pa_last = pa+a->length-1; pb_last = pb+b->length-1;
  99.         c->length = a->length+b->length;//C顺序表示要存储a b两个表中的数据的 所以存储空间应该是二者的和 由此来申请C的存储空间
  100.         c->listsize = c->length;
  101.        
  102.         c->elem = (int *)malloc(c->listsize*sizeof(int));
  103.         if(!c->elem){
  104.                 printf("合并后的顺序表申请内存失败!\n");
  105.                 exit(OVERFLOW);
  106.         }
  107.         pc = c->elem;
  108.        
  109.         while(pa<=pa_last&&pb<=pb_last){//归并
  110.                 if(*pa<=*pb){
  111.                         *pc++ = *pa++;
  112.                 }       
  113.                 else{
  114.                         *pc++ = *pb++;
  115.                 }
  116.         }
  117.        
  118.         while(pa<=pa_last) *pc++ = *pa++;//插入顺序表a剩下的元素
  119.         while(pb<=pb_last) *pc++ = *pb++;//插入顺序表b剩下的元素
  120.          
  121.         return OK;
  122. }


  123. main(){
  124.         int a_length,b_length;
  125.         Sqlist a,b,c;
  126.        
  127.         InitList(&a);
  128.         printf("第一个顺序表你想输入多少个元素?\n");
  129.         scanf("%d",&a_length);
  130.         IncreaseList(&a,a_length);//是否需要增加分配空间
  131.         CreatList(&a,a_length);
  132.         PrintList(&a);
  133.        
  134.         InitList(&b);
  135.         printf("\n第二个顺序表你想输入多少个元素?\n");
  136.         scanf("%d",&b_length);
  137.         IncreaseList(&b,b_length);//是否需要增加分配空间
  138.         CreatList(&b,b_length);
  139.         PrintList(&b);
  140.         printf("合并后");
  141. //无序顺序表的合并       
  142.         UnionWx(&a,b);
  143.         PrintList(&a);
  144. //有序线性表的合并
  145. //        UnionYx(&a,&b,&c);
  146. //        PrintList(&c);
  147. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-20 05:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表