1

リストの先頭に追加する短いリンクリストコードを実装しました。

ただし、頭には常にが含まれていNULLました。なぜこのように振る舞うのか、私は本当に理解できませんでした。どんな助けでも大歓迎です!以下はコードです:

#include<stdio.h>
#include<stdlib.h>

typedef struct node
{
    int iData;
    struct node *next;
} Node;

void add2Beg(Node* head, int num);


int main(int argc, char const *argv[])
{
    Node *head = NULL;
    add2Beg(head, 5);
    if (head == NULL)
        printf("nothing in head !!!\n");
else{
    printf("not null\n");
}
    add2Beg(head, 15);
    return 0;
}

//adds to the beginning of the linked list
void add2Beg(Node* head, int num)
{
    //create a temporary location to hold the new entry
    Node* temp = (Node *)malloc(sizeof(Node));
    temp->iData = num;

    if(head == NULL)
    {
        head = temp;
        printf("inside add2Beg\n");
        printf("%d\n", head->iData);
        head->next = NULL;
        printf("exiting add2Beg\n");
    }
    else
    {
        temp->next = head;
        printf("%p\n", temp->next);
        head = temp;
    }

}
4

3 に答える 3

6

head内部の変数add2Beg()はその関数に対してローカルであるためです。それに新しいポインタ値を割り当てると( )、関数の変数head = temp;のみが変更されます。ポインタからポインタを渡す必要があります。head

void add2Beg(Node** head, int num)

次に*head、関数内で使用します。

if(*head == NULL)
{
    *head = temp;

次のような行に注意してください-これはまたはhead->next = NULL;として書き直す必要があります。(*head)->next = NULL;(**head).next = NULL;

等々。次に、次のように関数を呼び出します。

add2Beg(&head, 15);
于 2012-09-20T19:05:13.547 に答える
1

関数add2begは、変更された場合に新しいヘッドを返しません。関数を次のように変更します。

Node * add2Beg(Node* head, int num)

そして最後に頭を返します:

return head;
于 2012-09-20T19:05:56.287 に答える
1

NULL以外にヘッドを割り当てたことがないため...

//here you set it to NULL then pass it to your function
Node *head = NULL; 
add2Beg(head, 5);

ここであなたの関数であなたは「頭」のコピーを渡します

void add2Beg(Node* head, int num)   
{
   //create a temporary location to hold the new entry   
    Node* temp = (Node *)malloc(sizeof(Node));   
    temp->iData = num;      
    if(head == NULL)     //we'll get in here

この時点でtempを割り当てるので、この関数の範囲内では無効になりますが、この関数を終了するとNULLに戻ります。

ポインタ「head」のコピーを渡して、それを「head」と呼びました。値を更新するには、値を返してそれを割り当てるか、main()この関数に向かうためのポインターを渡す必要があります。

ソリューション:

Node *head = NULL; 
head = add2Beg(head, 5);

Node* add2Beg(Node* head, int num){
    ...
    return head;

また

Node *head = NULL; 
add2Beg(&head, 5);

void add2Beg(Node** head, int num){
    ...
于 2012-09-20T19:06:56.197 に答える