RecycleBins 2019-10-21 01:50 采纳率: 50%
浏览 435

c语言单链表每次进行查找操作和排序操作的时候程序就闪退

刚学单链表,但是程序每到进行查找操作和排序操作,程序就闪退
编译的时候也没有报错,深夜求助,下面是测试程序的一些片段,单链表初始化和其他操作如插入、删除、输出等都没什么问题,就是一到下面两种操作就闪退了,两个操作函数都是void型的

Linklist L;
ElemType *e;
case 9:printf("请输入元素的位置\n");scanf("%d",&flag);GetElem(L,flag,e);break;//找到flag位置的数据并print出来
case 14:LinkSort(&L);break;//对单链表中的数据排序

下面是查找操作的函数

void GetElem(Linklist L,int i,Elemtype *e)
{
    if (L==NULL)
    {
        printf("单链表不存在\n");
    }
    else
{
     if (L->next==NULL)
    {
        printf("单链表为空\n");
    }//前提判断
    else{
    int length;
    length=ListLength(L);
    if (i>length||i<0)
    {
        printf("输入错误\n");
    }//判断输入合法性
    else
    {
    int j=0;
    for (j = 0; j < i; j++)
    {
        (*e)=(L->next)->data;
        L=L->next;
    }//循环i次,将L->next指向第i个节点,并传值给*e
    printf("第%d个位置的数据为%d\n",i,*e);
    }
}
}
}

下面是排序操作的函数,排序操作的我的思想是,创建一个新单链表,然后将传入的单链表的每个节点的数据先与新单链表中的数据进行比较,从小到大确定位置,然后再用插入操作,将每个数据插入新的单链表中

void LinkSort(Linklist *L)
{
    if ((*L)==NULL)
{
    printf("单链表不存在\n");
}
else
    {
        int l=ListLength(*L);
        if (l<2)
        {
            printf("单链表中至少要有两个元素才能进行排序\n");
        }
        else
        {
    int i;
    Linklist p=(*L)->next;
    Linklist q,s;
    q=(Linklist)malloc(sizeof(LNode));
    q->next=NULL;
    s=(Linklist)malloc(sizeof(LNode));
    s->data=p->data;
    s->next=NULL;
    q->next=s;//先将传入单链表的第一个节点的数据添加到新单链表中去
    Linklist r=q->next;
    p=p->next;
    while(p->next!=NULL)
    {
        i=1;//i是用来确定后续插入位置的
        while((p->data)>(r->data)&&r->next!=NULL)
        {
            i++;
            r=r->next;
        }
        if ((p->data)>(r->data))
        {
            i++;
            ListInsert(&q,i,p->data);
        }
        else
            ListInsert(&q,i,p->data);
        p=p->next;
        r=q->next;
    }
        i=1;
        while((p->data)>(r->data)&&r->next!=NULL)
        {
            i++;
            r=r->next;
        }
        if ((p->data)>(r->data))
        {
            i++;
            ListInsert(&q,i,p->data);
        }
        else
            ListInsert(&q,i,p->data);
        *L=q;
        printf("排序完成\n");
    }
    }
}

再附上插入操作函数

void ListInsert(Linklist *L,int i,Elemtype e)
{
    if (*L==NULL)
    {
        printf("单链表不存在\n");
    }
    else
    {
        int length=ListLength(*L);
        if (i<1||i>length+1)
        {
            printf("输入错误\n");
        }//判断输入的合法性
        else
        {
            Linklist p=*L;
            int j=0;
            for (j = 0; j <i-1 ; j++)
            {
                p=p->next;
            }//通过循环使p指向所要插入节点位置的前一个节点
            Linklist *r;
            (*r)=(Linklist)malloc(sizeof(LNode));
            (*r)->data=e;
            (*r)->next=p->next;
            p->next=*r;//将新建立的节点插入
            printf("插入成功\n");
        }
    }
}

这是操作情景,直接退回桌面了 呜呜呜
图片说明

  • 写回答

1条回答 默认 最新

  • 关注
    评论

报告相同问题?

悬赏问题

  • ¥25 关于##爬虫##的问题,如何解决?:
  • ¥15 ZABBIX6.0L连接数据库报错,如何解决?(操作系统-centos)
  • ¥15 找一位技术过硬的游戏pj程序员
  • ¥15 matlab生成电测深三层曲线模型代码
  • ¥50 随机森林与房贷信用风险模型
  • ¥50 buildozer打包kivy app失败
  • ¥30 在vs2022里运行python代码
  • ¥15 不同尺寸货物如何寻找合适的包装箱型谱
  • ¥15 求解 yolo算法问题
  • ¥15 虚拟机打包apk出现错误