2017-10-17 3 views
0

私はセグメンテーションフォールトを与えているこのメソッドを持っていますが、私はそれを理解することができません。与えられた名前と一致するノードを削除する必要があります。式*headの値が空のリストについてNULLに等しくすることができるので、関数は動作が未定義たスターターについてノード構造体を使用する際のセグメンテーションフォルト

typedef struct node 
{ 
int id; 
char* name; 
struct node* next; 
} node; 

node* rem_inorder(node** head, char* key_name) 
{ 

node* temp = *head; 
int found =0; 
while(temp -> next != NULL &&!found) 
{ 

if(temp -> name == key_name){ 
    printf("works"); 
    found = -1;} 
else { 
    temp = temp ->next;}} 
if(found == -1) 
{return temp;} 
else 
{return NULL;}} 
+0

Iを示すコードで参照ない問題を定義することができます。あなたのリンクされたリストはおそらく、この機能に入る前に他の場所から壊れています。唯一参照しているのは 'temp->'なので、 '* head'はいいとは言えません。 – yano

+0

あなたはそれで何を意味していますか?頭が悪いです。これは、リストを通る一時変数です。私はそれを頭にどのように割り当てるべきですか? –

+0

私はこの機能で実際にセグメンテーションを取得している場合は、 '* head'がおそらく' NULL'またはごみの値であると言っています。 – yano

答えて

1

。この場合、この式temp -> nextは無効になります。

また、ノードを検索するときにポインタの代わりに文字列を比較する必要があります。

割り当ての説明に従って、見つかったノードをリストから削除する必要があります。

関数は、以下のよう

node * rem_inorder(node **head, const char *key_name) 
{ 
    node *target = NULL; 

    while (*head && strcmp((*head)->name, key_name) != 0) 
    { 
     head = &(*head)->next; 
    } 

    if (*head != NULL) 
    { 
     target = `*head; 
     *head = (*head)->next; 
     target->next = NULL; 
    } 

    return target; 
}` 
+0

ありがとうございました! –

関連する問題