链接列表元素未显示

时间:2017-07-28 04:27:40

标签: c pointers data-structures struct linked-list

这是我在C中的程序,它总是插入到最后的链表中。但是当我尝试打印列表元素时,不会显示任何内容。这是代码:

#include<stdio.h>
#include<stdlib.h>
struct Node
{
    int data;
    struct Node *next;
};
void insert(struct Node *, int);
int main(void)
{
    struct Node *head = NULL, *current;
    int n, i, x, data;
    scanf("%d", &n);
    for(i = 0; i < n; i++)
    {
        scanf("%d", &data);
        insert(head, data);
    }
    current = head;
    while(current != NULL)
    {
        printf("%d ", current->data);
        current = current->next;
    }
}
void insert(struct Node *head, int data)
{
    struct Node *newnode, *current = head;
    newnode = (struct Node *)malloc(sizeof(struct Node));
    newnode->data = data;
    newnode->next = NULL;
    if(head == NULL)
    {
        head = newnode;
    }
    else
    {
        while(current->next != NULL)
        {
            current = current->next;
        }
        current->next = newnode;
    }
}

我无法理解可能是什么问题。请帮忙。

5 个答案:

答案 0 :(得分:3)

您的insert无法修改head。将其更改为

void insert(struct Node **head, int data)

并通过

进行更改

*head = newnode;

并像这样称呼它

insert(&head, data);

答案 1 :(得分:2)

您需要传递 head指针的引用,然后只显示对其所做的更改。

您必须将您的功能声明为

void insert(struct Node **, int);

也称之为

insert(&head, data);

另外,更改功能定义

void insert(struct Node **head, int data)
{
    struct Node *newnode, *current = *head;
    newnode = (struct Node *)malloc(sizeof(struct Node));
    newnode->data = data;
    newnode->next = NULL;
    if(*head == NULL)
    {
        *head = newnode;
    }
    else
    {
        while(current->next != NULL)
        {
            current = current->next;
        }
        current->next = newnode;
    }
}

答案 2 :(得分:2)

此处,当您将head指针传递给insert()函数时,main()函数中的指针未进行更新。

因此,要么将head指针声明为全局,要么返回head指针,并在main()函数中更新它。

在下面的代码中,我将head指针视为全局,并将head指针从insert()函数中删除为参数。

以下是代码: -

#include<stdio.h>
#include<stdlib.h>
struct Node
{
    int data;
    struct Node *next;
};
struct Node *head=NULL;
void insert(int);
int main(void)
{
    struct Node  *current;
    int n, i, x, data;
    clrscr();
    scanf("%d", &n);
    for(i = 0; i < n; i++)
    {
    scanf("%d", &data);
    insert(data);
    }
    current = head;
    while(current != NULL)
    {
    printf("%d \n", current->data);
    current = current->next;
    }
    getch();
    return 0;
}
void insert(int data)
{
    struct Node *newnode, *current = head;
    newnode = (struct Node *)malloc(sizeof(struct Node));
    newnode->data = data;
    newnode->next = NULL;
    if(head == NULL)
    {
    head = newnode;
    }
    else
    {
    while(current->next != NULL)
        {
            current = current->next;
        }
        current->next = newnode;
    }
}

答案 3 :(得分:1)

您需要在head之前通过insert(head, data); ,因为您要对其进行更改。{/ p>

insert(&head, data);

应该成为

void insert(struct Node *head, int data)

此外,功能签名也会改变。

void insert(struct Node **head, int data)

应该成为

current = *head;

还要对功能进行适当的更改。

像,

Jenkins -> Manage Jenkins -> In-process Script Approval

答案 4 :(得分:0)

因为您按值传递指针。该函数对指针的副本进行操作,并且永远不会修改原始文件。

将指针传递给指针(即结构头**),或者让函数返回指针。

您可以尝试运行以下代码,将输出显示为空

printf("%s",head);
while(current != NULL)
{
    printf("%d", current->data);
    current = current->next;
}