将元素添加到排序列表

时间:2018-03-21 18:03:29

标签: c list sorting pointers

我有一个列表问题,更具体 - 添加新元素。 此函数用于将新元素添加到适当位置的排序列表

ListEl* PushFrontsort(ListEl* head, ElType k)
{
    ListEl* x = (ListEl*) malloc(sizeof(ListEl));
    x->key = k;
    x->next = NULL;
    ListEl* y=head;
    ListEl* w=head;
    ListEl* new1 = (ListEl*) malloc(sizeof(ListEl));
    new1=head;
    w=w->next;
    if(head->key >= x->key)
    {
        x->next=head;
        new1=x;
    }
    else
    {
        while(w->key < x->key &&w->next)
        {
            y=w;
            w=w->next;
        }
        y->next=x;
        x->next=w;
    }
    return new1;
}

元素的类型如下:

typedef struct ListEl {
    ElType key;
    struct ListEl *next;
} ListEl;

当我尝试使用以下说明添加新的随机元素时:

    int i;
    srand(time(NULL));
    ListEl* head = NULL;
    head = PushFront(head, rand()%100);
    for (i = 0; i < 20; i++)
        head = PushFrontsort(head, rand()%100);

不仅有时它不会添加20个数字并且在19处停止,但通常是程序崩溃。 整个问题是我不知道是什么原因导致这种正确执行的随机性。 如果你能给我任何改进建议,我将非常感激。 任何帮助将不胜感激

1 个答案:

答案 0 :(得分:1)

只有当您对ListEl的第二次通话的值key大于您的第一次通话时,才会出现此错误。这就是为什么代码失败〜%50%的原因,因为这完全取决于随机调用的数字。至于&#34;有时候不添加20个数字并且在19&#34;处停止,我不确定为什么会这样,因为我无法重现这个。

要解决您的问题,请从this回答,&#34;如果您需要一个typedeffed类型的指针,请声明一个实例,但保持您的typedef类型,以便不屏蔽间接级别&#34;

因此,如果您将代码更改为:

int i;
srand(time(NULL));
ListEl a = {0, NULL};
ListEl* head = &a; 
head = PushFront(head, rand()%100);
for (i = 0; i < 20; i++)
    head = PushFrontsort(head, rand()%100);

你应该不再有任何问题。此外,将typedef更改为:

可能是一种很好的形式
typedef struct _ListEl {
    int key;
    struct _ListEl *next;
} ListEl;

以区分struct类型和struct类型的实例。说实话,我不确定为什么要这样做,所以如果有更多知识渊博的人可以编辑/插入,请随意。