从链表中排序元素

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; } } 

//我是数据结构的新手。我在尝试对链接列表的元素进行排序时遇到了一些问题。列表没有得到排序。非常感谢任何帮助。

a是一个未初始化的指针,所以该行

 a->data=temp->data; 

调用未定义的行为。 崩溃是最可能的结果,因为您将尝试在未定义的地址写入内存,该地址可能无法由您的代码写入,或者可能被您程序的其他部分使用。

您可以通过提供与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 } ... } 

编辑:行中还有一个潜在的NULL取消引用崩溃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; } }