最后一次printf调用(printf(“%d \ n”,current-> val);)将不会被执行。在第一个printf函数的结果出现后,我收到错误“program.exe已停止工作”。我将不胜感激。
#include <stdio.h>
typedef struct node
{
int val;
struct node * next;
} node_t;
void print_list(node_t * head);
void main()
{
node_t * head = NULL;
head = malloc(sizeof(node_t));
if (head == NULL)
return 1;
head->val = 3;
head->next = malloc(sizeof(node_t));
head->next->val = 2;
head->next->next = malloc(sizeof(node_t));
head->next->next->val = 3;
head->next->next->next = malloc(sizeof(node_t));
head->next->next->next->val = 18;
print_list(head);
head->next->next->next->next = malloc(sizeof(node_t));
head->next->next->next->next->val = 5556;
head->next->next->next->next->next = NULL;
node_t * current = head;
while (current->next != NULL)
{
current = current->next;
}
current->next = malloc(sizeof(node_t));
current->next->val = 32;
current->next->next = NULL;
printf("%d", current->next->val);
system("pause");
}
void print_list(node_t * head) {
node_t * current = head;
while (current != NULL) {
printf("%d\n", current->val);
current = current->next;
}
}
答案 0 :(得分:2)
这不太顺利:
ipfs shutdown
您从未将head->next->next->next = malloc(sizeof(node_t));
head->next->next->next->val = 18;
print_list(head);
初始化为NULL。而是使用head->next->next->next->next
,或者将值显式设置为NULL。更好的是,编写一个函数来创建一个新节点,这样你就不会忘记初始化。更好的是,编写一个插入节点的函数。
这样的事情:
calloc
然后你可以:
node_t * create_node( int val ) {
node_t *node = malloc(sizeof(*node));
if( node ) {
node->val = val;
node->next = NULL;
}
return node;
}
node_t * insert_value( node_t *list, int value ) {
node_t *new_node = create_node( value );
if( !new_node ) {
return list;
} else if( list ) {
new_node->next = list->next;
list->next = new_node;
}
return new_node;
}
列表的常用方法是使用虚拟头节点,您永远不会打印出来。它只包含一个node_t *head = insert_value( NULL, 3 );
node_t *tail = head;
tail = insert_value( tail, 2 );
tail = insert_value( tail, 3 );
tail = insert_value( tail, 18 );
print_list( head );
指针,它是列表的开头,您忽略该值。如果你这样做了,那么你也可以使用next
函数在列表的第一个元素之前插入一个值。您还可以获得insert_value
始终管理整个列表的好处,您永远不必担心它会发生变化。