链接列表中的错误,指针

时间:2015-02-28 21:00:57

标签: c pointers

这段代码有什么问题?这只是创建一个链接列表并打印它。

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

struct node{
    struct node *next;
    int data;
 };

void printLinklist(struct node *head)
{
    struct node *temp = head;
    while(temp != NULL)
    {
        printf("%d\t",temp->data);
        temp = temp->next;
    }
    printf("\n");
}

void pushData(struct node *head, int val)
{
    struct node *temp = malloc(sizeof (struct node));
    temp->next = head;
    temp->data = val;
    head = temp;
}

int main()
{
    struct node *head = NULL;
    pushData(head, 1);
    pushData(head, 2);
    pushData(head, 3);
    pushData(head, 4);
    pushData(head, 5);

    printLinklist(head);
} 

我知道这样做的正确方法。为此我们必须在pushData()函数中传递&amp; head并将此函数的参数定义为双指针(在pushData()函数中将head替换为* head并将&amp; head作为参数传递)

我无法理解此代码中的问题。

3 个答案:

答案 0 :(得分:3)

参数总是passed by value。调用pushData()时,head的值(即存储在指针变量中的地址)将复制到函数的局部变量head中。更改此设置不会更改head函数中的main()变量。

如果您需要这样做,则必须通过&head,然后通过在pushData()函数中取消引用来分配值。

答案 1 :(得分:1)

问题是您在NULL中将head分配给main(),而且从不会发生任何问题,它可以像这样工作

struct node *pushData(struct node *head, int val)
{
    struct node *temp = malloc(sizeof (struct node));
    if (temp == NULL)
        return NULL;
    temp->next = head;
    temp->data = val;

    return temp;
}

并在主

int main()
{
    struct node *head;

    head = pushData(head, 1);
    head = pushData(head, 2);
    head = pushData(head, 3);
    head = pushData(head, 4);
    head = pushData(head, 5);

    printLinklist(head);
} 

传递指针只会修改指针指向的数据,而不是指针本身。

因此,在pushData()函数中,您可以执行此操作

head = temp;

更改本地指针,并使其指向temp,但一旦函数返回,更改就会丢失。

当您传递head的地址&head时,您可以更改指针,因为您的head指针将指向指针本身,而不是指针指向的数据到。

答案 2 :(得分:0)

真正的代码是:

#include <stdio.h>
#include <stdlib.h>
#pragma warning(disable:4996)   
struct node {
    struct node* next;
    int data;
};

void printLinklist(struct node* head)
{
    struct node* temp = head;
    while (temp->next != NULL)
    {
        printf("%d\t", temp->data);
        temp = temp->next;
    }
    printf("\n");
}

struct node* pushData(struct node* head, int val)
{
    struct node* temp = malloc(sizeof(struct node));
    if (temp == NULL)
        return NULL;
    temp->next = head;
    temp->data = val;

    return temp;
}

int main()
{
    struct node* head = malloc(sizeof(struct node));

    head = pushData(head, 1);
    head = pushData(head, 2);
    head = pushData(head, 3);
    head = pushData(head, 4);
    head = pushData(head, 5);
    struct node* head2 = head;
    for (int i = 0; i < 5; i++)
    {
        head2 = head2->next;
    }
    head2->next = NULL;
    printLinklist(head);
}