#include<stdio.h>
#include<malloc.h>
typedef struct node_t {
int i;
struct node_t* link;
} node;
node* head = NULL;
int main() {
int i = 10;
node* temp = NULL;
head = (node *)malloc(sizeof(node));
temp = (node *)malloc(sizeof(node));
if(temp == NULL) {
printf("\n malloc for temp node failed! \n");
}
else {
/* linked list logic to add the elements in the beginning */
while(i<=10) {
temp->i = i;
temp->link = NULL;
if(head == NULL) {
head = temp;
}
else {
temp->link = head;
head = temp;
}
i++;
}
}
for(temp = head; temp->link != NULL; temp = temp->link) {
printf("\n The data is:%d \n",temp->i);
}
free(temp);
free(head);
return 0;
}
我正在尝试一个简单的链接列表程序。我没有得到输出。
答案 0 :(得分:2)
你似乎有一个无限循环! (i的值没有改变)
答案 1 :(得分:2)
1)每次为tmp
赋值时,都必须分配节点(tmp
)。并且不只分配一次tmp
。请参阅以下固定代码以了解如何操作
2)以下for
循环错误:
for(temp = head; temp->link != NULL; temp = temp->link) {
此for
循环在以下代码中修复
3)对于free
,您必须浏览整个链表,然后释放每个节点。请参阅以下固定代码。
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef struct node_t{
int i;
struct node_t* link;
}node;
node* head = NULL;
int main(){
int i = 1;
node* temp = NULL;
/* linked list logic to add the elements in the beginning */
while(i<=10){
temp = (node *)malloc(sizeof(node));
if(temp == NULL){
printf("\n malloc for temp node failed! \n");
exit(1);
}
temp->i = i;
temp->link = NULL;
if(head == NULL){
head = temp;
}
else{
temp->link = head;
head = temp;
}
i++;
}
for(temp = head; temp != NULL; temp = temp->link){
printf("\n The data is:%d \n",temp->i);
}
while (head!=NULL)
{
temp = head->link;
free(head);
head = temp;
}
}
答案 2 :(得分:1)
您没有在while循环中更改变量i
的值,因此您永远不会退出while循环。
您需要以下内容:
int i=1;
while(i<=10){
// insert i in loop
i++;
}
答案 3 :(得分:1)
您没有更改循环变量的值,即i
。
此外,您需要在while循环中执行malloc
以创建单独的节点。现在,您的代码一次又一次地修改同一节点。
答案 4 :(得分:1)
除了关于无限循环的节点之外,由于你永远不会修改i
的值,所以还有其他错误。
22 /* linked list logic to add the elements in the beginning */
23 while(i<=10){
24 temp->i = i;
25 temp->link = NULL;
26 if(head == NULL){
27 head = temp;
28 }
29 else{
30 temp->link = head;
31 head = temp;
看看你在这个循环中做了什么。如果head是NULL(它不太可能,因为你在第15行中分配了它,尽管分配可能会失败)你将'head'设置为temp。
如果head不为NULL,则将temp的'link'设置为head。然后你设定为临时。然后你循环再做一遍。
所以你最终指向temp,temp-&gt;链接指向temp ...一个正好一个节点的循环列表。
请改为尝试:
int main()
{
int i = 0;
node *temp;
/* linked list logic to add the elements in the beginning */
while(i != 10)
{
/* First, allocate a new node */
temp = (node *)malloc(sizeof(node));
if(temp == NULL)
return -1; /* yikes */
/* now set its value */
temp->i = i++;
/* and link it into the list, at the beginning */
temp->link = head;
head = temp;
}
/* Now traverse the list, starting from 'head' */
temp = head;
while(temp != NULL)
{
/* save the current node in a temporary variable */
node *temp2 = temp;
/* and move 'temp' to point to the next node in the list */
temp = temp->link;
/* print the current node */
printf("\n The data is: %d\n", temp2->i);
/* and free the memory */
free(temp2);
}
return 0;
}