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;
}
}
我是数据结构的新手。我在尝试对链表的元素进行排序时遇到了一些问题。list 没有排序。非常感谢任何帮助。
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)
中也存在潜在的空取消引用崩溃。 下面的代码显示了避免这种情况的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;
}
}
我在代码中进行了更改并添加了更改的注释
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;
}
}
//终于我找到了自己问题的答案,这就是解决方案,感谢您的帮助伙伴
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;
}
}