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);
}
4

5 に答える 5

1

あなたはfriend *headグローバルでなければなりません。

そして、

void node_add(friend* new) 
{
    new = (friend* )malloc(sizeof(friend));
    new->next = head;
    head = new; 
} 
于 2012-04-27T10:20:24.997 に答える
1

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

于 2012-04-27T10:03:33.873 に答える
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;
}

削除と挿入の実装は、読者の課題として残されています。

于 2012-04-27T09:55:56.063 に答える
0

ダブルポインターを使用する必要があります。

void node_add(friend **new) {
    *new = malloc(sizeof(friend));
    /* etc */
}
于 2012-04-27T10:03:54.713 に答える
-1

問題は次の行にあります: amit.name = "amit";

あなたはmallocであり、strcpy()を実行する必要があります

于 2012-04-27T10:07:05.213 に答える