我只是在學習鏈表,我試圖創建一個函式,它遍歷鏈表并列印出每個值。
但是,在我的 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;
}
uj5u.com熱心網友回復:
程式的問題是你沒有初始化指向頭節點的指標
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;
}
uj5u.com熱心網友回復:
初始化頭:
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
....
這將觸發您的輸出功能,當它到達“OhNo”之前/之前,它指向誰知道在哪里。
使用 init 它是
head->NULL
head->1->NULL
head->2->1->NULL
...
后者與您的輸出功能完美配合。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/410352.html
標籤:
上一篇:訪問沖突寫入c中的二維陣列
下一篇:讀取和列印矩陣
