void sortlist()
{
struct node *a;
struct node *temp=head;
struct node *temp1=head->next;
while(temp!=NULL)
{
while(temp1->next!=NULL)
{
if(temp->data > temp1->data)
{
a->data=temp->data;
temp->data=temp1->data;
temp1->data=a->data;
}
else
{
temp1=temp1->next;
}
}
temp=temp->next;
}
}
//我是数据结构的新手。我在尝试对链接列表的元素进行排序时遇到了一些问题。列表没有得到排序。非常感谢任何帮助。
答案 0 :(得分:4)
a
是一个未初始化的指针,所以行
a->data=temp->data;
调用未定义的行为。崩溃是最可能的结果,因为您将尝试在未定义的地址写入内存,该地址可能无法由您的代码写入,或者可能被您程序的其他部分使用。
您可以通过提供与a
相同类型的temp->data
来解决此问题。
void sortlist()
{
int a; // change type to match node->data if required
...
if(temp->data > temp1->data)
{
a=temp->data;
temp->data=temp1->data;
temp1->data=a
}
...
}
编辑:行while(temp1->next!=NULL)
中还存在潜在的NULL解除引用崩溃。下面的代码显示了sortlist
的潜在实现,避免了这种情况。
void sortlist()
{
struct node *ptr=head;
while(ptr!=NULL) {
struct node *next;
if (ptr == NULL)
return;
next = ptr->next;
while(next!=NULL) {
if(ptr->data > next->data) {
int a=ptr->data;
ptr->data=next->data;
next->data=a;
}
next = next->next;
}
ptr=ptr->next;
}
}
答案 1 :(得分:0)
我在代码中进行了更改并添加了更改的注释
void sortlist()
{
// struct node *a; /* this is not required. */
/* NULL checks are required,if head is NULL,head->next will crash.*/
if(head == NULL || head->next == NULL) return;
struct node *temp=head;
struct node *temp1=head->next;
while(temp!=NULL)
{
while(temp1->next!=NULL)
{
if(temp->data > temp1->data)
{
/* assuming you data is integer*/
int d=temp->data;
temp->data=temp1->data;
temp1->data=d;
}
//else /* else is not required, better to remove it.*/
//{
temp1=temp1->next;
//}
}
temp=temp->next;
}
}
答案 2 :(得分:0)
//最后我找到了自己问题的答案,这就是解决方案,感谢您的帮助伙伴
void sortlist()
{
struct node *temp=head;
int s;
struct node *temp1=temp->next;
while(temp!=NULL)
{
temp1=temp->next;
while(temp1!=NULL)
{
if(temp->data > temp1->data)
{
s=temp->data;
temp->data=temp1->data;
temp1->data=s;
}
temp1=temp1->next;
}
temp=temp->next;
}
}