穷小疯 发表于 2019-12-25 17:39:43

复制顺序表出现了问题

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

typedef struct
{
    KeyType R;
    int length;
}*orderList,Node;
orderList init_orderList()
{
    orderList l=(orderList)malloc(sizeof(Node));
    l->length=0;
   // printf("顺序表初始化成功");
    return l;
}
//随机产生一些数字
intproduce_randomNum(orderList l)
{
    srand(time(0));
    int n,m,a,i,j;
    printf("随机产生1-m范围的 n个数:\n");
    scanf("%d %d",&m,&n);//产生n个1-m之间的数字
    for(i=1; i<=n; i++)
    {
      a=rand()%m+1;
      //printf("%d ",a);
      l->R[++l->length].key=a;
    }
    return n;

}
void copy(orderList l,orderList r)
{
        int j;
        for(j=0;j<l->length;j++)
    {
            r=l;
    }
}
void insertSort(orderList l)
{
    int i,j;
    int signal;
    compareTimes=moveTimes=0;
    for(i=2; i<=l->length; i++) //从第二个数开始依次与前面的数字比较
    {
      signal=l->R.key;//当前结点作为标志结点
      j=i-1;
      while(j>=1)//从当前结点下一个开始与标志结点比较
      {
            compareTimes++;

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

                moveTimes++;

                l->R=l->R;

                j--;
            }
            if(l->R.key<=signal)//小于标志结点,结束
                break;
      }
      moveTimes++;

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

}
void print_orderList(orderList l)
{
    int i;
    for(i=1; i<=l->length; i++)
      printf("%d ",l->R.key);
    printf("\n");
}
int main()
{
        clock_t start, finish;
    doubleTotal_time;
    int choice;
    orderList l;
    orderList r;
    int n;
    while(1)
    {
      printf("1.初始化数据\n");
      printf("2.直接插入排序\n");
      printf("8.输出数据\n");
      printf("请选择操作\n");
      scanf("%d",&choice);
      switch(choice)
      {
      case 1:
            l=init_orderList();
                        n=produce_randomNum(l);
                        copy(l,r);
            break;
      case 2:
              start = clock();
            insertSort(l);//直接插入排序
            finish   = clock();
            Total_time = (double) (finish - start) / CLOCKS_PER_SEC;
            printf("所用时间为%lf\n",Total_time);
            break;

      case 8:
            //打印数字
            print_orderList(l);
            print_orderList(r);;
            break;
      case 0:
            //退出
            exit(0);
      default:
            printf("您输入的数据有误,请重新输入\n");
            break;

      }
      printf("请按任意键继续\n");
      getch();
      system("cls");
      continue;
    }
    return 0;
}

Croper 发表于 2019-12-25 18:11:41

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

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

如果你r初始化为(Node*)malloc(sizeof(Node))的化
根本不需要copy函数,直接*r=*l就行了啊,你结构内部又不含指针,不存在深拷贝浅拷贝的问题

穷小疯 发表于 2019-12-25 19:01:13

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

我想问一下具体在哪修改嘞,我改的地方应该有问题,还是会报错

Croper 发表于 2019-12-25 23:07:59

r声明的时候初始化orderList r=(Node*)malloc(sizeof(Node));

心驰神往 发表于 2020-11-3 13:53:25

看指针头疼

zhangjinxuan 发表于 2022-8-17 16:21:02

会不会可能是内存泄漏,下标越界,不合法指针转换呢?

ExiaGN001 发表于 2022-8-18 16:31:14

会不会是野指针或者数组越界
检查一下是不是所有指针开始都有指向或者NULL
有没有出现a[-1]这种情况

陈尚涵 发表于 2022-8-24 11:30:50

e

zhangjinxuan 发表于 2022-8-26 13:05:31

e

aaron0919 发表于 2022-8-26 21:34:51

我竟然看不懂

C丁洞杀O 发表于 2022-8-28 21:28:56

不是很想看,但他报错了{:9_229:}
页: [1]
查看完整版本: 复制顺序表出现了问题