-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

ハック的な修正(コードのロジックに従わなかったため、これが正しいかどうかはわかりません)は、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;

[..]

正しい修正は、リストを適切にウォークすることです(NULL要素に到達するまでリストをウォークできる場合、リストの最後であるため、リストには6つの要素があると想定しているようです)。

于 2012-09-06T05:33:32.870 に答える