2012-04-27 14 views
2

新しいノードをリンクされたプロファイルのリストに追加しようとしましたが(例えば、Facebookのプロフィールの場合)、起動時にランタイムエラーが発生します。これは私が持っているものです:リンクされたリストにノードを追加しようとしています

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <stdlib.h> 
typedef struct friend 
{ 
    char *name; 
    int age; 
    char gender; 
    struct friend* next; 
}friend; 
void node_add(friend* new); 
int main(int argc, char *argv[]) 
{ 
friend amit; 
friend* new; 
amit.name = "amit"; 
amit.age = 16; 
amit.gender = 'm'; 
node_add(new); 
new->name = "amit"; 
printf ("name: %s\n", new->name); 
system("PAUSE");  
return 0; 
} 
void node_add(friend* new) 
{ 
new = (friend*)malloc(sizeof(friend)); 
friend* head = new; 
new -> next = head; 
} 

私は今ノード削除機能を作成しようとしています。私は、ユーザーが削除したいんどのノード発見し、問題がある

delete -> next = delete -> next -> next 

を行うことによって、それを削除しようとしました、私は、リスト内の最初のノードのために取得する必要があります。ここ は、私が書いたものである:

void node_delete(friend* delete) 
{ 
friend* temp; 
char name[256]; 
int i = 0, j =0; 
printf ("Please enter the friend's name you want to delete: \n"); 
fgets (name, 256, stdin); 
fgets (name, 256, stdin); 
while (0 == (strcmp(temp -> next -> name, delete -> next -> name))) 
{ 
     temp = friend -> next; 
} 
temp -> next = temp -> next -> next; 
free (delete); 
} 
+0

で正確なエラーは何ですか? –

+0

プログラムを実行しようとすると、実行時にエラーが発生します... これはあなたのためのものではない場合は、正確なエラーを表示する方法がわかりません... –

+1

なぜあなたはノード自体への '次の'ポインタ? – Christoffer

答えて

1

編集:このコードではかなり深刻な問題が実際に存在しているので、それは、私のテストは、ダニあまりにも速かったようだが、それは微妙だ

main()では、あなたは実際に何かを新たに指していることはありません。それは時々動作するかもしれないメモリ空間への単なる文字化けしたポインタであり、大抵の場合、ひどいです。

friend *new; // here's your problem; change this to: 
friend *new = malloc(sizeof(friend)); 

また、mallocの結果をキャストしないでください。

再編集:

非常に単純なリンクリストの実装がどのように見えるか:削除と挿入の

typedef struct _node node; 
struct _node { 
    void *payload; 
    node *next; 
}; 

node *create_node() { 
    node *retval = malloc(sizeof(node)); 

    retval->payload = NULL; 
    retval->next = NULL; 

    return retval; 
} 

node *add_node (node *target) { 
    if (target->next) 
    return; 

    node *next = create_node(); 
    node->next = next; 
} 

node *node_search (node *haystack, void *needle) { 
    while (haystack) { 
    if (!compare(needle, haystack->payload)) { 
     return haystack; 
    } else { 
     haystack = haystack->next; 
    } 
    } 

    return NULL; 
} 

実装は、読者への課題として残されています。

+0

私はそれを削除しましたが、それは助けになりませんでした.... –

+0

@AmitSegal:あなたはあなたが得ている正確なエラーを投稿する必要があります。 –

+0

どうすればいいですか? –

1

もちろん、メモリを割り当ててローカル変数に割り当てます。 ポインタを変更する場合は、もう1つのアスタリスクをポインタに渡します。 そして、友人や新人のような名前は付けないでください。そのキーワードはC++、 であり、必要な問題はありません。

0

ダブルポインタを使用する必要があります。問題は次の行にある

void node_add(friend **new) { 
    *new = malloc(sizeof(friend)); 
    /* etc */ 
} 
+0

これは必須ではありません。ノードが新規ノードに追加され、参照によって返されないためです。 –

+0

このコードを使用すると、私はもうSEGFAULTを持っていません... – md5

+0

ああ、何を知っていますか?彼は参考としてそれを返す。私はそれが故意ではないと思っています。 –

-1

: amit.name = "アミット"。

あなたはmallocのこととあなたがfriend *headがグローバル持つべき

+0

いいえ、その行は問題ありません。 –

+0

@Adarsh:いいえ、そうです。 – md5

1

のstrcpy()を実行する必要があります。

そして

void node_add(friend* new) 
{ 
    new = (friend*)malloc(sizeof(friend)); 
    new->next = head; 
    head = new; 
} 
関連する問題