0

リンクリストがあり、名前で並べ替えたい(たとえば、「Bx」、「Tx」、「Ax」の名前は「Ax」、「Bx」、「Tx」になります)...必要ですノードの右側にあるものに「小さい名前」がある場合に名前を切り替えるには..

これは私が書いたものです:

typedef struct data
{
char *name;
}data;

typedef struct Node 
{
data NodeData;
struct Node *next;
struct Node *prev;
}Node;

void Sorting(Node *head)
{
 Node *temp = head;
 Node *temp2 = (Node*)malloc(sizeof(Node));
 while (temp != NULL)
 {
       if (1 == (strcmp(temp -> NodeData.name, temp -> next -> NodeData.name))) 
       {
              strcpy (temp2 -> NodeData.name, temp -> NodeData.name);
              strcpy (temp -> NodeData.name, temp -> next -> NodeData.name);
              strcpy (temp -> next -> NodeData.name, temp2 -> NodeData.name);
       } 

       temp = temp -> next;

 }

}

ランタイムが発生します-ノードの名前(strcpy行)間でスワープする必要がある部分でエラーが発生しました:アクセス違反(セグメンテーション違反)...

4

3 に答える 3

1

データ値を交換してリストを並べ替える必要はないと思います。代わりに、ノード自体を交換する必要があります。これには、ポインタをリストの新しい最初のノードに戻す必要があることに注意してください。

編集:二重間接ポインターに興味がある場合は、リストの先頭にポインターを渡すことも機能します。コードもシンプルにすることができます。

于 2012-05-20T20:05:29.370 に答える
0
if (1 == (strcmp(temp -> NodeData.name, temp -> next -> NodeData.name))) {...}

この行が実行されるとき、temp->nextがNULLでないという保証はありません。NULLの場合、temp->next->NodeData.Nameはかなり苦痛になります。

また、すでに述べたように、strcmp()の結果を1に対してテストすることは正しくありません。strcmpは、ゼロ、<ゼロ、または>ゼロに等しい任意の値を返すことができます。

また、すでに述べたように、strcpy()は正しくありません。文字列には、割り当てられたサイズが異なる場合や、書き込み不可能なメモリ(文字列定数)に存在する場合があります。ポインタを入れ替えるだけで十分です。

アップデート:

void Sorting(Node *head)
{
 Node *temp ;

                /* since the compare dereferences temp->next you'll have to verify that it is not NULL */
 for (temp = head; temp && temp->next; temp = temp->next)  
 {
       if (strcmp(temp->NodeData.name, temp->next->NodeData.name) > 0 )  
       {
                /* no need for a whole node, since you only copy a pointer */
              char *cp;
              cp = temp->NodeData.name;
              temp->NodeData.name = temp->next->NodeData.name;
              temp->next->NodeData.name = cp;
       } 

 }

}

ところで:リンクリストのバブルソートは本当に醜いです。リンクリストは、マージソートによってより簡単に、より遅れてソートされます。

于 2012-05-20T21:01:55.163 に答える
0

temp2char*ここにいます

char *temp2;

Nodeでもここで

strcpy (temp2 -> NodeData.name, temp -> NodeData.name);

そうです、この行でtemp2は、構造体または共用体であるかのように動作しますが、そうではありません。

于 2012-05-20T19:51:52.193 に答える