链表追加中的分段错误
Segmentation Fault In Linked List Append
我一直在使用链表,我在新文件中使用了以下代码作为追加函数,它运行良好,但是当我复制它时,我的主代码在 while(current->next != null)
处出现分段错误.它在编译时没有给出任何警告,所以我不知道这里有什么问题。
// Linked List Node for Reading Comments
struct Node{
char value;
struct Node *next;
};
void append(struct Node * headNode, char newElement){
struct Node *newNode = malloc(sizeof(struct Node)); //Dynamically Allocating Memory for New Node
struct Node *current = headNode; //Creating A Node to traverse the linked list
newNode->value = newElement; //Assigning the values of newNode to the given value
newNode->next = NULL; //Setting next value to be null since its the last node
if (headNode == NULL){ //Checking if headnode is empty
headNode = newNode; //Assigning headnode and tailnode to be newnode
}
else {
while(current->next != NULL){ //Traversing through the linked list
current = current->next;
}
current->next = newNode; //Setting tailnode's next to be newnode
}
}
void printLinkedList(struct Node* headNode){
while(headNode != NULL){
fprintf(stderr,"%c",headNode->value);
headNode = headNode->next;
}
}
如果有人可以对此发表评论,请发表评论。
您的代码不允许将节点添加到空列表。如果您尝试并没有在调用方初始化您的 head
指针,您可能会遇到这样的行为。
例如,在 main
中,您可以:
struct Node* head; // not initialised
append(head, 'a');
printLinkedList(head);
接下来就是这些问题:
- 如果
head
恰好不是 NULL
,那么 else
块将启动并且 current
指针将引用一些意外的内存地址。
append
不会改变main
的head
变量。它只会修改恰好具有相似名称的局部变量(headNode
)。
更正,将head
的地址传给append
函数,让append
相应处理:
void append(struct Node ** headNode, char newElement) {
struct Node *newNode = malloc(sizeof(struct Node));
struct Node *current = *headNode;
newNode->value = newElement;
newNode->next = NULL;
if (*headNode == NULL) {
*headNode = newNode;
} else {
while(current->next != NULL) {
current = current->next;
}
current->next = newNode;
}
}
注意在 headNode
出现的地方附加 *
。在 main
:
struct Node* head;
append(&head, 'a');
printLinkedList(head);
我一直在使用链表,我在新文件中使用了以下代码作为追加函数,它运行良好,但是当我复制它时,我的主代码在 while(current->next != null)
处出现分段错误.它在编译时没有给出任何警告,所以我不知道这里有什么问题。
// Linked List Node for Reading Comments
struct Node{
char value;
struct Node *next;
};
void append(struct Node * headNode, char newElement){
struct Node *newNode = malloc(sizeof(struct Node)); //Dynamically Allocating Memory for New Node
struct Node *current = headNode; //Creating A Node to traverse the linked list
newNode->value = newElement; //Assigning the values of newNode to the given value
newNode->next = NULL; //Setting next value to be null since its the last node
if (headNode == NULL){ //Checking if headnode is empty
headNode = newNode; //Assigning headnode and tailnode to be newnode
}
else {
while(current->next != NULL){ //Traversing through the linked list
current = current->next;
}
current->next = newNode; //Setting tailnode's next to be newnode
}
}
void printLinkedList(struct Node* headNode){
while(headNode != NULL){
fprintf(stderr,"%c",headNode->value);
headNode = headNode->next;
}
}
如果有人可以对此发表评论,请发表评论。
您的代码不允许将节点添加到空列表。如果您尝试并没有在调用方初始化您的 head
指针,您可能会遇到这样的行为。
例如,在 main
中,您可以:
struct Node* head; // not initialised
append(head, 'a');
printLinkedList(head);
接下来就是这些问题:
- 如果
head
恰好不是NULL
,那么else
块将启动并且current
指针将引用一些意外的内存地址。 append
不会改变main
的head
变量。它只会修改恰好具有相似名称的局部变量(headNode
)。
更正,将head
的地址传给append
函数,让append
相应处理:
void append(struct Node ** headNode, char newElement) {
struct Node *newNode = malloc(sizeof(struct Node));
struct Node *current = *headNode;
newNode->value = newElement;
newNode->next = NULL;
if (*headNode == NULL) {
*headNode = newNode;
} else {
while(current->next != NULL) {
current = current->next;
}
current->next = newNode;
}
}
注意在 headNode
出现的地方附加 *
。在 main
:
struct Node* head;
append(&head, 'a');
printLinkedList(head);