-1

请让我知道这段代码有什么问题,其中我在开头添加了一些节点然后显示它们,进一步尝试排序,但我没有得到排序结果......谢谢:)

#include <stdio.h>
#include <conio.h>
#include <malloc.h>


 struct node
{

int data;
struct node *link;
};

void append(struct node **q,int num)
{
 struct node *temp;
 temp=malloc(sizeof(struct node));
 temp->data=num;
 temp->link=*q;
 *q=temp;

}

void display(struct node *q)
{    struct node *temp;
 temp=q;
 printf("\n");
 while(q!=NULL)
{
    printf(" %d",q->data);
    q=q->link;
}
q=temp;
}
 void sort(struct node *q)
 {
 struct node *temp1, *temp2; int i,j,temp3;
temp1=q;
  temp2=q->link;
 for(i=0;i<6;i++)
{
    for(j=0;j<6-i;j++)
    {
        if(temp1->data>temp2->data)
        {
            temp3=temp1->data;
            temp1->data=temp2->data;
            temp2->data=temp3;
        }
        temp2=temp2->link;
    }
    temp1=temp1->link;
    temp2=temp1->link;
 }

}
void main()
{
struct node *p;
p=NULL;
append(&p,7);
append(&p,5);
append(&p,9);
append(&p,2);
append(&p,8);
display(p);
sort(p);
display(p);
}
4

1 回答 1

0

我没有尝试遵循整个逻辑,但您的问题是您正在取消引用 NULL 指针:

cristi:tmp diciu$ gdb ./a.out
GNU gdb 6.3.50-20050815 (Apple version gdb-1708) (Mon Aug  8 20:32:45 UTC 2011)
[..]
(gdb) r
Starting program: /private/tmp/a.out 

Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0x0000000000000000
0x0000000100000d68 in sort (q=0x100100970) at test.c:44
44          if(temp1->data > temp2->data)
(gdb) p temp1
$1 = (struct node *) 0x100100970
(gdb) p temp2
$2 = (struct node *) 0x0

一个 hackish 修复(我没有遵循代码的逻辑,所以我不确定这是正确的)是避免取消引用 NULL 指针:

void sort(struct node *q)
{
     struct node *temp1, *temp2; int i,j,temp3;
     temp1=q;
     temp2=q->link;
     for(i=0;i<6;i++)
     {
         if(temp1==NULL || temp2==NULL)
                 continue;
         for(j=0;j<6-i;j++)
         {
              if(temp2 == NULL)
                  continue;
              if(temp1->data > temp2->data)
              {
                  temp3=temp1->data;

[..]

正确的解决方法是正确遍历列表(当您可以遍历列表时,您似乎假设列表有 6 个元素,直到您点击 NULL 元素,因为那是列表的结尾)。

于 2012-09-06T05:33:32.870 回答