这是我在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;
}
}
我无法理解可能是什么问题。请帮忙。
答案 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;
}