我有一个列表问题,更具体 - 添加新元素。 此函数用于将新元素添加到适当位置的排序列表
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处停止,但通常是程序崩溃。 整个问题是我不知道是什么原因导致这种正确执行的随机性。 如果你能给我任何改进建议,我将非常感激。 任何帮助将不胜感激
答案 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类型的实例。说实话,我不确定为什么要这样做,所以如果有更多知识渊博的人可以编辑/插入,请随意。