我正在完成一项Hackerrank挑战,包括将元素添加到链接列表并打印它。
输入采用以下格式:一组整数,其中第一个元素给出大小,其余元素是列表的组成部分。
我用Java完成了挑战,但我无法用C语言完成。 输入4 2 3 4 1应打印2 3 4 1,但我编码的这个片段给我1 1 1 1 1 1 .... {truncated}
我的方法:声明Node类型的新结构 temp (数据输入为数据字段,下一个字段为NULL),然后遍历链表以head为起点,当它到达最后一个元素时,将最后一个元素的下一个字段更改为当前元素的地址。
代码:
#include <stdlib.h>
#include <stdio.h>
typedef struct Node{
int data;
struct Node* next;
}Node;
Node* insert(Node *head,int data)
{
Node temp = {data, NULL} ;
if (head == NULL)
{ head =&temp;
return head;
}
else{
Node* current = head ;
while(current->next !=NULL)
current = current->next ;
current->next = &temp;
return head;
}
}
void display(Node *head)
{
Node *start=head;
while(start)
{
printf("%d ",start->data);
start=start->next;
}
}
int main()
{
int T,data;
scanf("%d",&T);
Node *head=NULL;
while(T-->0){
scanf("%d",&data);
head=insert(head,data);
}
display(head);
}
答案 0 :(得分:5)
必须动态分配列表节点。此
Node temp = {data, NULL} ;
声明一个局部变量。引用其声明函数范围之外的地址是未定义的行为。
替换为
Node *temp = malloc(sizeof(Node));
temp->data = data;
temp->next = NULL;
现在thtat temp
是一个指针,表达式&temp
也必须替换为temp
。
答案 1 :(得分:2)
因为您在列表中保存了指向局部变量的指针。当insert
函数返回时,局部变量temp
将超出范围并停止存在。保存指向它并使用该指针将导致未定义的行为。 Find a good beginners book并阅读关于内存的动态分配。