【问题标题】:Linked list sort from smallest to biggest链表从小到大排序
【发布时间】:2015-04-11 16:06:07
【问题描述】:

我正在尝试将链表中的数字从小到大排序。

但它不起作用!

当我将第二个数字放入 列表(主要)但我不知道为什么。

有什么帮助吗?

#include<stdio.h>

#include<stdlib.h>

typedef struct list list;

struct list{

    int a;

    list *nxt;
};

void sort(list *l){

    int temp,tp;
    list *AIDE,*k;
    k=AIDE=(list*)malloc(sizeof(list));
    while (l->nxt!= NULL)
    {

        while (l->nxt->a < l->a)
        {

            temp=l->a;
            l=l->nxt;
            l->nxt->a=temp;
            l=l->nxt;
            while (l->a < AIDE->nxt->a )
            {
                tp=AIDE->a;
                AIDE->a=l->a;
                AIDE->nxt->a=tp;
                AIDE=AIDE->nxt;

            }
        }
        l=l->nxt;
    }
    while (k->nxt!= NULL)
    {
        l->a=k->a;
        l=l->nxt;
        k=k->nxt;
    }
    l->nxt=NULL;
}

int main() {

    list *t,*s;
    int n,i,c=0;
    printf("\n how many number you need to enter? ");
    scanf("%d",&n);
    s=t=(list*)malloc(sizeof(list)*n);
        while (c!=n)
        {
            printf("\n Donner le nb %d :",c+1);
            scanf("%d",&t->a);
            t=t->nxt;
            c++;
        }
        t->nxt=NULL;
        sort(s);
        while (t->nxt!=NULL)
        {
            printf("%d",t->a);
        }
    return 0;

}

【问题讨论】:

  • 您是否尝试过在调试器中逐行执行代码?
  • 是的,问题就在这里:while (c!=n) { printf("\n Donner le nb %d :",c+1); scanf("%d",&t->a); t=t->nxt; C++; } 当我输入第二个数字时,程序粉碎并停止工作
  • 你得到什么错误?

标签: c pointers linked-list


【解决方案1】:

在您遇到问题的循环中,您认为表达式t=t-&gt;nxt 会做什么?

当您进入循环时,t 指向已分配但 未初始化 的内存,因此取消引用例如t-&gt;nxt 将导致undefined behavior

一个简单的解决方案是例如做

t->nxt = t++ + 1;

【讨论】:

  • 我只想转到变量 a 所在的链表中的下一个结构体..
  • @cip 但是当你分配内存时,没有链表,只是一个包含看似随机数据的内存区域。将内存视为一个由n 数量的list 结构组成的数组,每个结构都未初始化。
猜你喜欢
  • 1970-01-01
  • 2013-06-28
  • 1970-01-01
  • 2018-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多