Beginning 中的链表插入
Linked List insertion in Beginning
我正在尝试使用 C 基本创建链表。我编写了以下代码,该代码一直运行到第一个节点,但最终在第二个节点上失败。我认为问题出在我试图在用箭头 (->) 分隔的列表中显示节点值的地方。我认为我的逻辑是正确的,但请纠正我。提前致谢
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
struct node
{
int number;
struct node *next;
};
typedef struct node NODE;
NODE *node1, *node2, *start, *save;
int main()
{
node1 = (NODE *)malloc(sizeof(NODE));
int i = 0;
start = NULL;
for(i = 0; i < 3; i++)
{
int inf;
printf("Enter node value:");
scanf("%d", &inf);
node1->number = inf;
node1->next = NULL;
if(start == NULL)
{
start = node1;
save = node1;
}
else
{
// save=start;
// start=node1;
// node1->next=save;
node1->next = start;
start = node1;
}
while(node1 != NULL)
{
printf("%d ->",node1->number);
node1 = node1->next;
}
}
return 0;
}
您应该在 for
循环中使用 malloc()
。
由于它在外面,所以正在使用相同的内存。
正如 Vamsi 所说,您应该使用 malloc
将节点放在堆上。您通常也不应该强制转换 malloc
的输出,这不是必需的。然后你可以尝试制作一个双向链表,其中你的 struct
.
中也有一个 prev
指针
问题是
- 您如何分配用于插入的节点(即,除了一个,您不是)。
- 解决上述问题后,它们在列表中的位置。
- 不要在 C 程序中强制转换
malloc
(阅读 here 了解原因)。
- 无法检查您的
scanf
调用是否成功。
- 无法检查您的
malloc
调用是否成功
在你气馁之前,你所做的事情正确:
- 是否没有屏蔽
typedef
中的节点指针
- 正确包含 MCVE 以供审核
- 展望了您可能做错的事情。
一个非常将三个值迭代到链表中的简单示例如下所示:
#include <stdio.h>
#include <stdlib.h>
struct node
{
int number;
struct node *next;
};
typedef struct node NODE;
int main()
{
NODE *head = NULL, *p;
int i = 0;
for(i = 0; i < 3; i++)
{
int inf;
printf("Enter node value:");
if (scanf("%d", &inf) == 1)
{
p = malloc(sizeof *p);
if (p != NULL)
{
p->number = inf;
p->next = head;
head = p;
}
else
{
perror("Failed to allocate new node");
return EXIT_FAILURE;
}
}
else
{
// failed to read data. break
break;
}
// report current linked list
printf("%d", p->number);
for (p=p->next; p; p = p->next)
printf(" -> %d", p->number);
fputc('\n', stdout);
}
// cleanup the linked list
while (head)
{
p = head;
head = head->next;
free(p);
}
head = NULL;
return 0;
}
输入
根据提示输入值1 2 3
:
输出
Enter node value:1
1
Enter node value:2
2 -> 1
Enter node value:3
3 -> 2 -> 1
祝你好运。
我正在尝试使用 C 基本创建链表。我编写了以下代码,该代码一直运行到第一个节点,但最终在第二个节点上失败。我认为问题出在我试图在用箭头 (->) 分隔的列表中显示节点值的地方。我认为我的逻辑是正确的,但请纠正我。提前致谢
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
struct node
{
int number;
struct node *next;
};
typedef struct node NODE;
NODE *node1, *node2, *start, *save;
int main()
{
node1 = (NODE *)malloc(sizeof(NODE));
int i = 0;
start = NULL;
for(i = 0; i < 3; i++)
{
int inf;
printf("Enter node value:");
scanf("%d", &inf);
node1->number = inf;
node1->next = NULL;
if(start == NULL)
{
start = node1;
save = node1;
}
else
{
// save=start;
// start=node1;
// node1->next=save;
node1->next = start;
start = node1;
}
while(node1 != NULL)
{
printf("%d ->",node1->number);
node1 = node1->next;
}
}
return 0;
}
您应该在 for
循环中使用 malloc()
。
由于它在外面,所以正在使用相同的内存。
正如 Vamsi 所说,您应该使用 malloc
将节点放在堆上。您通常也不应该强制转换 malloc
的输出,这不是必需的。然后你可以尝试制作一个双向链表,其中你的 struct
.
prev
指针
问题是
- 您如何分配用于插入的节点(即,除了一个,您不是)。
- 解决上述问题后,它们在列表中的位置。
- 不要在 C 程序中强制转换
malloc
(阅读 here 了解原因)。 - 无法检查您的
scanf
调用是否成功。 - 无法检查您的
malloc
调用是否成功
在你气馁之前,你所做的事情正确:
- 是否没有屏蔽
typedef
中的节点指针
- 正确包含 MCVE 以供审核
- 展望了您可能做错的事情。
一个非常将三个值迭代到链表中的简单示例如下所示:
#include <stdio.h>
#include <stdlib.h>
struct node
{
int number;
struct node *next;
};
typedef struct node NODE;
int main()
{
NODE *head = NULL, *p;
int i = 0;
for(i = 0; i < 3; i++)
{
int inf;
printf("Enter node value:");
if (scanf("%d", &inf) == 1)
{
p = malloc(sizeof *p);
if (p != NULL)
{
p->number = inf;
p->next = head;
head = p;
}
else
{
perror("Failed to allocate new node");
return EXIT_FAILURE;
}
}
else
{
// failed to read data. break
break;
}
// report current linked list
printf("%d", p->number);
for (p=p->next; p; p = p->next)
printf(" -> %d", p->number);
fputc('\n', stdout);
}
// cleanup the linked list
while (head)
{
p = head;
head = head->next;
free(p);
}
head = NULL;
return 0;
}
输入
根据提示输入值1 2 3
:
输出
Enter node value:1
1
Enter node value:2
2 -> 1
Enter node value:3
3 -> 2 -> 1
祝你好运。