遍历链表时出现分段错误
Segmentation fault while looping through a linked list
我刚开始学习链表,我尝试创建一个函数,循环遍历链表并打印出每个值。
但是,在我的 while 循环结束时,当我经过最后一个节点时出现分段错误。
虽然我可以通过将条件从 (temp != NULL) 设置为 (temp->next != NULL) 来消除分段错误,但我仍然遇到错误。
我会在这里提供一些帮助。
我提供了出现错误的打印函数,但如果需要,我也可以提供完整的代码。
void printList(node_t *head){
node_t *temp = head;
if (temp != NULL) {
while (temp->next != NULL) {
int i = temp->value;
printf("%d\n", i);
temp = temp->next;
}
}
}
添加了更多代码。
#include <stdio.h>
#include <stdlib.h>
struct node{
int value;
struct node *next;
};
typedef struct node node_t;
void printList(node_t *head){
node_t *temp = head;
if (temp != NULL) {
while (temp->next != NULL) {
int i = temp->value;
printf("%d\n", i);
temp = temp->next;
}
}
}
node_t *create_new_node(int value){
node_t *next_pointer = malloc(sizeof(node_t));
next_pointer->value = value;
next_pointer->next = NULL;
return next_pointer;
}
node_t *insert_at_head(node_t **head, node_t *new_node){
new_node->next = *head;
*head = new_node;
return new_node;
}
int main(){
node_t *tmp, *head;
for(int i= 0; i<25; i++){
tmp = create_new_node(i);
insert_at_head(&head, tmp);
}
printList(head);
return 0;
}
程序的问题是你没有初始化指向头节点的指针
node_t *tmp, *head;
因此,随着新节点被添加到头部,最后一个节点的下一个数据成员具有不确定的值。
你需要写
node_t *tmp, *head = NULL;
函数printList
可以看成下面的样子
void printList( const node_t *head )
{
for ( ; head != NULL; head = head->next )
{
printf( "%d\n", head->value );
}
}
函数 create_new_node
也应按以下方式定义
node_t * create_new_node( int value )
{
node_t *next_pointer = malloc(sizeof(node_t));
if ( next_pointer != NULL )
{
next_pointer->value = value;
next_pointer->next = NULL;
}
return next_pointer;
}
初始化磁头:
node_t *tmp, *head=NULL;
这样最终成为最后一个 next
的内容定义明确,将阻止访问谁知道在哪里。
然后我得到一个很好的向后输出(减去最后一个元素,首先插入,0;见 Jabberwocky 的评论)。
例如这里 https://www.tutorialspoint.com/compile_c_online.php
否则你会:
head->OhNo
head->1->OhNo
head->2->1->OhNo
....
当它到达 at/before “OhNo” 时,这会启动你的输出函数,它指向谁知道的地方。
有了init就
头->NULL
head->1->NULL
head->2->1->NULL
...
后者与您的输出函数配合得很好。
我刚开始学习链表,我尝试创建一个函数,循环遍历链表并打印出每个值。
但是,在我的 while 循环结束时,当我经过最后一个节点时出现分段错误。
虽然我可以通过将条件从 (temp != NULL) 设置为 (temp->next != NULL) 来消除分段错误,但我仍然遇到错误。 我会在这里提供一些帮助。
我提供了出现错误的打印函数,但如果需要,我也可以提供完整的代码。
void printList(node_t *head){
node_t *temp = head;
if (temp != NULL) {
while (temp->next != NULL) {
int i = temp->value;
printf("%d\n", i);
temp = temp->next;
}
}
}
添加了更多代码。
#include <stdio.h>
#include <stdlib.h>
struct node{
int value;
struct node *next;
};
typedef struct node node_t;
void printList(node_t *head){
node_t *temp = head;
if (temp != NULL) {
while (temp->next != NULL) {
int i = temp->value;
printf("%d\n", i);
temp = temp->next;
}
}
}
node_t *create_new_node(int value){
node_t *next_pointer = malloc(sizeof(node_t));
next_pointer->value = value;
next_pointer->next = NULL;
return next_pointer;
}
node_t *insert_at_head(node_t **head, node_t *new_node){
new_node->next = *head;
*head = new_node;
return new_node;
}
int main(){
node_t *tmp, *head;
for(int i= 0; i<25; i++){
tmp = create_new_node(i);
insert_at_head(&head, tmp);
}
printList(head);
return 0;
}
程序的问题是你没有初始化指向头节点的指针
node_t *tmp, *head;
因此,随着新节点被添加到头部,最后一个节点的下一个数据成员具有不确定的值。
你需要写
node_t *tmp, *head = NULL;
函数printList
可以看成下面的样子
void printList( const node_t *head )
{
for ( ; head != NULL; head = head->next )
{
printf( "%d\n", head->value );
}
}
函数 create_new_node
也应按以下方式定义
node_t * create_new_node( int value )
{
node_t *next_pointer = malloc(sizeof(node_t));
if ( next_pointer != NULL )
{
next_pointer->value = value;
next_pointer->next = NULL;
}
return next_pointer;
}
初始化磁头:
node_t *tmp, *head=NULL;
这样最终成为最后一个 next
的内容定义明确,将阻止访问谁知道在哪里。
然后我得到一个很好的向后输出(减去最后一个元素,首先插入,0;见 Jabberwocky 的评论)。
例如这里 https://www.tutorialspoint.com/compile_c_online.php
否则你会:
head->OhNo
head->1->OhNo
head->2->1->OhNo
....
当它到达 at/before “OhNo” 时,这会启动你的输出函数,它指向谁知道的地方。
有了init就
头->NULL
head->1->NULL
head->2->1->NULL
...
后者与您的输出函数配合得很好。