2012-05-05 18 views
-1

私はnode_add関数を作成していましたが、それは私にはうまくいきます。 しかし、私はnode_deleteを作成するのに苦労しています。ここでノードを削除するにはどうしたらいいですか?

は、私が書いたものである:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <stdlib.h> 
typedef struct friend // The struct 
{ 
    char *name; 
    int age; 
    char gender; 
    struct friend* next; // A pointer that points to the next node in the linked list 
}friend; 
void node_delete(); // The deleting node function 
friend* head; // Definging the head of the linked list 
void node_delete() // Deleting a node 
{ 
char name[256]; 
printf ("Please enter the friend's name you want to delete: \n"); 
fgets (name, 256, stdin); 
fgets (name, 256, stdin); // Getting the name of the person that the user wants to delete 
while (head -> next != NULL) // As long the node isnt the last one 
{ 
     if (0 == (strcmp(head -> name, name))) // If the name that the user entered matchs a name in the linked list, 
     { // It'll skip it 
      head -> next = head -> next -> next; // Deletes a node from the linked list 
     } 
     head -> next; // Going to the next node 
} 
free(head); // Freeing the deleted node 
} 

私は、ノード削除機能に問題がこの少し近いの

+3

あなたは私たちに問題を作成するコードの一部だけを与えることができればそれは確かに役立つだろう。さらに、あなたの実際の問題が何であるかを記述することも良い考えです。 – Thilo

+0

私はそれを追加しました.. :) –

答えて

1
if (head) { 
    if (strcmp(head->name, name) == 0) { 
    to_free = head; 
    head = head->next; 
    free(to_free); 
    } else { 
    list = head; 
    while (list->next) { 
     if (strcmp(list->next->name, name) == 0) { 
     to_free = list->next; 
     list->next = list->next->next; 
     free(to_free); 
     break; // if only one 
     } 
     list = list->next; 
    } 
    } 
} 
+0

jdizzleの答えは私のものと同じですが、jdizzleの方がC-コーディングの基礎をもっと深く理解していますが、私のほうが明白です。 –

+0

私が他の解決策で言ったように、私は頭の中に何を入れますか? 私はそれにかなりのトラブルを抱えていました...私は友人の頭をするとき、私は頭の中に何を入れますか? –

+0

ええ、私はあなたの質問をgrokしないでください。あなたはリンクされたリストを持っています:headという変数はリストの最初の要素を指し、リンケージは - > nextポインタによって行われます。リンクされたリストをトラバースすると、新しいポインタ(listやtmpなど)を取得し、最初はheadと同じポインタをポイントし、 - > nextをたどって移動します。あなたが削除したい場合、あなたは3つの場合があります:あなたのリストは空です=>何もしません。あなたの最初の要素(頭が指すもの)が一致するので、あなたの頭のポインタはリストの次の要素を指し示す必要があります。あなたは中途半端なものを削除します –

0

顔をしています。

while (head -> next != NULL) // As long the node isnt the last one 
{ 
     if (0 == (strcmp(head -> name, name))) // If the name that the user entered matchs a name in the linked list, 
     { // It'll skip it 
      head -> next = head -> next -> next; // Deletes a node from the linked list 
     } 
     head -> next; // Going to the next node 
} 

それは実際にあなたはおそらく頭が=ヘッドにする必要があり、リンクされたリスト

head -> next; // Going to the next node 

を横断していない - 「頭」とは上の保持唯一のものであれば、また>次

リンクされたリストの先頭にhead = head-> nextとすると、リストの一部が失われます。 temp = headのように一時的なポインタを作成することをお勧めします。その後、一時ポインタをトラバースします。

+0

注意:リンクされたリストから削除されたノードは現在 'head-> next'であり、' head'は削除されるべきです。したがって、おそらくあなたの状態を再調整する必要があります。 – Thilo

+0

私は1つの問題がありますが、何を言ったのか理解しています.... 頭を定義する方法はわかりません。 リンク先リストの先頭を指し示すにはどうすればいいですか? –

1
struct friend **tmp = &head; 
while (*tmp != NULL && (0 != (strcmp((*tmp)->name, name)))) { 
    tmp = &((*tmp)->next); 
} 
if (*tmp) { 
    struct friend *freeme = (*tmp); 
    (*tmp) = (*tmp)->next; 
    free(freeme); 
} 
+1

あなたはfree()を忘れてしまいます。あなたは本当に信じていますか?元のポスターはこれを怒らせますか? –

+1

彼はそれを理解するのに十分な時間を目にすると、彼に全く新しい世界を開くでしょう。 – jdizzle

+1

あなたは正しいです:-)素晴らしい見解です。 –