鱼C论坛

 找回密码
 立即注册
查看: 2582|回复: 10

复制顺序表出现了问题

[复制链接]
回帖奖励 6 鱼币 回复本帖可获得 2 鱼币奖励! 每人限 1 次
发表于 2019-12-25 17:39:43 | 显示全部楼层 |阅读模式

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

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

x
对顺序表进行深度复制,即操作其中一个顺序表是,对另一个顺序表没有影响。代码应该是复制那块出了问题,可能是关键字类型不同,有没有大佬帮我改一下。
  1. #include <stdio.h>
  2. #include <time.h>
  3. #include <stdlib.h>
  4. #include <conio.h>
  5. #define MAX_NUM 32768
  6. int compareTimes;//比较次数
  7. int moveTimes;//移动次数
  8. typedef int ElemType;//元素类型
  9. typedef struct
  10. {
  11.     ElemType key;
  12. } KeyType;//关键字的类型

  13. typedef struct
  14. {
  15.     KeyType R[MAX_NUM+1];
  16.     int length;
  17. }*orderList,Node;
  18. orderList init_orderList()
  19. {
  20.     orderList l=(orderList)malloc(sizeof(Node));
  21.     l->length=0;
  22.    // printf("顺序表初始化成功");
  23.     return l;
  24. }
  25. //随机产生一些数字
  26. int  produce_randomNum(orderList l)
  27. {
  28.     srand(time(0));
  29.     int n,m,a,i,j;
  30.     printf("随机产生1-m范围的 n个数:\n");
  31.     scanf("%d %d",&m,&n);//产生n个1-m之间的数字
  32.     for(i=1; i<=n; i++)
  33.     {
  34.         a=rand()%m+1;
  35.         //printf("%d ",a);
  36.         l->R[++l->length].key=a;
  37.     }
  38.     return n;

  39. }
  40. void copy(orderList l,orderList r)
  41. {
  42.         int j;
  43.         for(j=0;j<l->length;j++)
  44.     {
  45.             r[j]=l[j];
  46.     }
  47. }
  48. void insertSort(orderList l)
  49. {
  50.     int i,j;
  51.     int signal;
  52.     compareTimes=moveTimes=0;
  53.     for(i=2; i<=l->length; i++) //从第二个数开始依次与前面的数字比较
  54.     {
  55.         signal=l->R[i].key;//当前结点作为标志结点
  56.         j=i-1;
  57.         while(j>=1)//从当前结点下一个开始与标志结点比较
  58.         {
  59.             compareTimes++;

  60.             if(l->R[j].key>signal)//大于标志结点,结点后移
  61.             {

  62.                 moveTimes++;

  63.                 l->R[j+1]=l->R[j];

  64.                 j--;
  65.             }
  66.             if(l->R[j].key<=signal)//小于标志结点,结束
  67.                 break;
  68.         }
  69.         moveTimes++;

  70.         l->R[j+1].key=signal;//第j+1个结点标志结点
  71.     }
  72.     printf("插入排序结果:\n");
  73. //    print_orderList(l);
  74.     printf("比较次数%d ,移动次数:%d\n",compareTimes,moveTimes);

  75. }
  76. void print_orderList(orderList l)
  77. {
  78.     int i;
  79.     for(i=1; i<=l->length; i++)
  80.         printf("%d ",l->R[i].key);
  81.     printf("\n");
  82. }
  83. int main()
  84. {
  85.         clock_t start, finish;
  86.     double  Total_time;
  87.     int choice;
  88.     orderList l;
  89.     orderList r;
  90.     int n;
  91.     while(1)
  92.     {
  93.         printf("1.初始化数据\n");
  94.         printf("2.直接插入排序\n");
  95.         printf("8.输出数据\n");
  96.         printf("请选择操作\n");
  97.         scanf("%d",&choice);
  98.         switch(choice)
  99.         {
  100.         case 1:
  101.             l=init_orderList();
  102.                         n=produce_randomNum(l);
  103.                         copy(l,r);
  104.             break;
  105.         case 2:
  106.                 start = clock();
  107.             insertSort(l);//直接插入排序
  108.             finish     = clock();
  109.             Total_time = (double) (finish - start) / CLOCKS_PER_SEC;
  110.             printf("所用时间为%lf\n",Total_time);
  111.             break;

  112.         case 8:
  113.             //打印数字
  114.             print_orderList(l);
  115.             print_orderList(r);;
  116.             break;
  117.         case 0:
  118.             //退出
  119.             exit(0);
  120.         default:
  121.             printf("您输入的数据有误,请重新输入\n");
  122.             break;

  123.         }
  124.         printf("请按任意键继续\n");
  125.         getch();
  126.         system("cls");
  127.         continue;
  128.     }
  129.     return 0;
  130. }
复制代码
(318_A_VBTY8L1U(S7`9__7.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-12-25 18:11:41 | 显示全部楼层

回帖奖励 +2 鱼币

本帖最后由 Croper 于 2019-12-25 18:15 编辑

首先,你r没有初始化,直接是个空悬指针,你向空悬指针指向的空间里里写任何东西当然都会报错。
第二,你copy函数里的l[ i],r[ i]是要干什么。。,至少你l指向的是单个Node不是Node数组,那么你l[1]就已经越界了。

如果你r初始化为(Node*)malloc(sizeof(Node))的化
根本不需要copy函数,直接
  1. *r=*l
复制代码
就行了啊,你结构内部又不含指针,不存在深拷贝浅拷贝的问题
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-25 19:01:13 | 显示全部楼层
Croper 发表于 2019-12-25 18:11
首先,你r没有初始化,直接是个空悬指针,你向空悬指针指向的空间里里写任何东西当然都会报错。
第二,你c ...

我想问一下具体在哪修改嘞,我改的地方应该有问题,还是会报错
CXN(7T$B35]LEFQ4V%D86%4.png
3)K02Z)PH16@]R`ZR%8Y[6V.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-25 23:07:59 | 显示全部楼层
r声明的时候初始化
  1. orderList r=(Node*)malloc(sizeof(Node));
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-3 13:53:25 | 显示全部楼层

回帖奖励 +2 鱼币

看指针头疼
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-17 16:21:02 | 显示全部楼层

回帖奖励 +2 鱼币

会不会可能是内存泄漏,下标越界,不合法指针转换呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-18 16:31:14 | 显示全部楼层

回帖奖励 +2 鱼币

会不会是野指针或者数组越界
检查一下是不是所有指针开始都有指向或者NULL
有没有出现a[-1]这种情况
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-24 11:30:50 | 显示全部楼层

回帖奖励 +2 鱼币

e
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-8-26 13:05:31 | 显示全部楼层
e
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-8-26 21:34:51 | 显示全部楼层

回帖奖励 +2 鱼币

我竟然看不懂
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-28 21:28:56 | 显示全部楼层

回帖奖励 +2 鱼币

不是很想看,但他报错了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-10 21:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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