鱼C论坛

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

复制顺序表出现了问题

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

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

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

x
对顺序表进行深度复制,即操作其中一个顺序表是,对另一个顺序表没有影响。代码应该是复制那块出了问题,可能是关键字类型不同,有没有大佬帮我改一下。
#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[MAX_NUM+1];
    int length;
}*orderList,Node;
orderList init_orderList()
{
    orderList l=(orderList)malloc(sizeof(Node));
    l->length=0;
   // printf("顺序表初始化成功");
    return l;
}
//随机产生一些数字
int  produce_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[j]=l[j];
    }
}
void insertSort(orderList l)
{
    int i,j;
    int signal;
    compareTimes=moveTimes=0;
    for(i=2; i<=l->length; i++) //从第二个数开始依次与前面的数字比较
    {
        signal=l->R[i].key;//当前结点作为标志结点
        j=i-1;
        while(j>=1)//从当前结点下一个开始与标志结点比较
        {
            compareTimes++;

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

                moveTimes++;

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

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

        l->R[j+1].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[i].key);
    printf("\n");
} 
int main()
{
        clock_t start, finish;
    double  Total_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;
}
(318_A_VBTY8L1U(S7`9__7.png
想知道小甲鱼最近在做啥?请访问 -> 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函数,直接
*r=*l
就行了啊,你结构内部又不含指针,不存在深拷贝浅拷贝的问题
想知道小甲鱼最近在做啥?请访问 -> 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-25 23:07:59 | 显示全部楼层
r声明的时候初始化
orderList r=(Node*)malloc(sizeof(Node));
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

回帖奖励 +2 鱼币

看指针头疼
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

回帖奖励 +2 鱼币

会不会可能是内存泄漏,下标越界,不合法指针转换呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

回帖奖励 +2 鱼币

会不会是野指针或者数组越界
检查一下是不是所有指针开始都有指向或者NULL
有没有出现a[-1]这种情况
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

回帖奖励 +2 鱼币

e
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-26 13:05:31 | 显示全部楼层
e
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

回帖奖励 +2 鱼币

我竟然看不懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

回帖奖励 +2 鱼币

不是很想看,但他报错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-23 06:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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