链接列表出现问题(添加和打印)

时间:2017-08-03 17:11:12

标签: c data-structures linked-list

我对数据结构太新了,实际上我昨天开始了。这是代码:

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

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

void addToList(node *r, int a);
void printList(node *r);
int main()
{
    node *root;
    root = NULL;

    for (int i = 0; i < 5; i++)
    {
        int a;
        scanf("%d", &a);
        addToList(root, a);
    }

    printList(root);

    return 0;
}

void addToList(node *r, int a)
{
    while (r != NULL)
        r = r -> next;

    r = (node *)malloc(sizeof(node));
    r -> x = a;
    r -> next = NULL;
}

void printList(node *r)
{
    while (r != NULL)
    {
        printf("%d ", r -> x);
        r = r -> next;
    }

    printf("\n");
}

我希望程序在列表中获取新的5个元素然后打印它们。但该计划的结束没有任何事情发生。我的错是什么?

3 个答案:

答案 0 :(得分:2)

问题出在addToList()函数中。如果要更新列表的根节点,则必须按以下方式定义函数:

void addToList(node **r, int a)

否则,您将指针发送到root并在函数内执行任何操作。但它不会影响rootmain()的价值,而且仍为NULL

如果要更改指针的值,则必须从main()将指针的地址发送到函数==&gt; addToList(&root, a);

现在我们可以更新root指向的位置。但这还不够,因为您希望root 始终指向列表的开头==&gt;您只想在第一次调用addToList()时更新它。

最后一个问题是将新创建的节点添加为列表中的最后一个节点。您可以通过保存指向最后一个节点的临时指针来实现。在代码中查看我的评论(使用<<<标记我的更改):

void addToList(node **root, int a)                   <<<
{
    node *r = *root;                                 <<<
    node *last = NULL;                               <<<

    while (r != NULL) {
        last = r;                                    <<<
        r = r -> next;
    }

    r = (node *)malloc(sizeof(node));
    r -> x = a;
    r -> next = NULL;
    if (last == NULL) {                              <<<
        // this is true only on the first call to
        // addToList, so we update root only once
        *root = r;
    } else {
        // all other times we add the new node to be the last one
        last->next = r;
    }
}

答案 1 :(得分:1)

您有root = NULL,但您的addtoList功能会检查root !=NULL。所以测试失败了,没有添加任何内容。 你应该有这样的东西:

 void addToList(node *r, int a) {
        struct node *temp;
        temp=(struct node *)malloc(sizeof(struct node));
        temp->data = a;
        if (r== NULL) {
            r = temp;
            r->next = NULL;
        }
        else {
            temp->next = r;
            r = temp;
        }
}

答案 2 :(得分:1)

这里,第一个错误是您没有将*root指针变量视为全局变量,因此每当插入新节点时它都不会更新*root的值。它会将*root的值保持为NULL

以下代码中包含注释,可以很容易地解释您所犯的各种错误。

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

struct node
{
    int x;
    node *next;
};
node *root;     //Declaring the *root as global

void addToList(int a);
void printList();
//removing the *root as parameter from both the functions

int main()
{
    root = NULL;
    for (int i = 0; i < 5; i++)
    {
    int a;
    scanf("%d", &a);
    addToList(a);
    }
    printList();
    return 0;
}

void addToList(int a)
{
    //Declaring a temporary pointer(*temp) to avoid the value loss of the *root pointer
    node *temp=root;

    //Declaring a new node to save the data taken from the user
    node *nn = (node *)malloc(sizeof(node));

    //Assigning the values to the new node(*nn)
    nn->x=a;
    nn->next=NULL;

    //Checking that the root node is NULL or not
    //If root is empty, then new node is assigned to *root
    if(root == NULL)
    {
        root=nn;
    }
    //Else, we will first find the last node of the linklist using the *temp pointer
    else
    {
        while (temp->next != NULL)
            temp = temp -> next;

        //Assigning the new node after the last node of the linklist
        temp->next=nn;
    }
}

void printList()
{
    node *r=root;
    while (r != NULL)
    {
        printf("%d ", r -> x);
        r = r -> next;
    }
    printf("\n");
}