3

リンクリストがあり、ヘッドの直後にノードを作成する必要があります。

それは私がこのようなものを持っていることを意味します:

node *head = NULL;

そして最後に私のリンクリストは次のようになるはずです:

head -> node -> NULL..。

しかし、通常のaddNode関数を使用すると、ランタイムエラーが発生します(どちらかわからない、デバッグに問題があります)...

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

void addNode(node *head)
{
node *temp = head; // a temp to not move the head
node *newNode = (node*)malloc(sizeof(node)); // The new node

while (temp -> next != NULL)
{
    temp = temp -> next // Getting to the last node
}

temp -> next= newNode; // Adding the new node into the linked list insted of the NULL
newNode -> next = NULL; // Adding the NULL after the new node
}

このコードは、すでに1つ以上のノードを持つリンクリストがある場合にうまく機能しますが、リンクリストにヘッドしかない場合は、問題が発生します...どうすれば問題を解決できますか?

(私の問題を理解していない場合-ここで書いたaddNode関数を使用すると、すでにNULLを指しているヘッドに新しいノードを追加するためのランタイムエラーが発生します)。

ありがとう、アミット:)

4

3 に答える 3

3

エントリ時にがNULLであるかどうかを確認する必要headがあります。そうでない場合、nullポインタが逆参照されます。

node *temp = head; /* temp set to head, possibly null. */

while (temp->next != NULL) /* 'temp' dereferenced, undefined behaviour
                              if 'temp' is null. */

呼び出し元が変更を確認できるようにするには、Cが引数を値で渡すため、( wildplassernode**によって提案されているように)aを渡す必要があります。次のように変更します(例):

void addNode(node **head)
{
    node *newNode = malloc(sizeof(node)); /* No need to cast. */
    if (newNode)
    {
        newNode->next = NULL;

        if (NULL == *head)
        {
            *head = newNode; /* Set the head, as there isn't one yet. */
        }
        else
        {
            node* temp = *head;
            while (temp->next) temp = temp->next;
            temp->next = newNode;
        }
    }
}

これは次のように呼ばれます。

node* my_list = NULL;
addNode(&my_list);
于 2012-06-29T11:22:32.863 に答える
2

Headがnullかどうかを確認する必要があります。そうでなければ、あなたがチェックしようとするとき

head->next != NULL

ヘッドがNULLであるため、メモリ内のランダムな場所を参照しています

headがNULLの場合、headの後にノードを追加することはできません。ヘッドにメモリを割り当ててから、「次の」ポインタを設定する必要があります。ちなみに、headがnullのときにhead-> nextを設定したいのはなぜですか?

編集

たぶん、bool activeのようなノードにフラグを追加して、それを渡すときにfalseに設定する必要があります。

I'll try to say it in another way. You can't set head->next because head is NULL. NULL means, that it's just a pointer, to nowhere. It's a variable where u can place some address, but nothing else. If u want to have there a structure, like node, you have to place there address of new object of type Node:

Node element = malloc(sizeof(Node));
head = element;

After that u will have in head address of Node object and u will be able to revoke to variables (like Node *next) inside this structure.

于 2012-06-29T11:23:33.980 に答える
1

ポインターへのポインターを使用できます。

void addNode(node **pp)
{
node *newNode = malloc(sizeof *newNode); // The new node

if (newNode) {
    newNode->next = *pp; // steal the parent. (this will also work if *pp happens to be NULL)
    *pp = newNode;       // let *pp point to the new node
    }
}

次のように呼び出されます。

...
node *head = NULL;
addNode( &head);
... 
于 2012-06-29T11:27:54.277 に答える