0

我看到一些相似的主題,但他們沒有幫助我。我已經建立了鏈表和一個插入元素的函數。段錯斷鏈表

struct node{ 
    int data; 
    struct node* next; 
} node; 

struct node* head; 

void insert(struct node* head,int x); 
int main(){ 
    struct node* head = (struct node*) malloc(sizeof(struct node)); 
    int x; 
    while(1){ 
     printf("Please enter number\n"); 
     scanf("%i", &x); 
     insert(head,x); 
     print(head); // function that works 
    } 
    return 0; 
} 
void insert(struct node* head,int x){ 
    struct node* temp = malloc(sizeof(struct node)); 
    temp->data = x; 
    temp->next = NULL; 
    if(head->next != NULL) temp->next = head; 
    head = temp; 
    free(temp); 
} 

GDB說,我得到段錯誤就行與建設是否:

if(head->next != NULL) temp->next = head; 

哪裏是我的錯?

+0

檢查頭本身是空 –

回答

-1

是的,當然它會給分段錯誤。在if條件下,您正在訪問head->nexthead只是類型struct node的指針。首先分配內存空間,然後訪問該字段。現在你正在訪問(head->next)這是內存中的一些不合適的地址,內核給進程提供了「分段錯誤」。對於例如struct node* head = malloc(sizeof(struct node));,然後可以訪問head->next

+0

感謝您的編輯@Sourav –

+0

歡迎。 HTH。 :-) –

+0

我以頭爲參數我不明白這會有什麼幫助。無論如何,我已經做了一個新的動態分配變種,並設置它=頭。我仍然收到seg。故障。 – user3181029

-1

在致電if(head->next != NULL) temp->next = head;之前,您需要檢查head。頭可能包含NULL。所以之前if(head->next != NULL) temp->next = head;

編輯添加if(head != NULL) 如果您發佈完整的代碼而問的問題很容易幫助您在正確的道路。現在人們認爲我們回答錯了,他們投了票。無論如何,這裏是我的答案。 你不應該在自己的插入函數中調用free(temp);。因爲您要訪問print函數中的內存。您自己釋放insert()中的已分配內存並嘗試訪問打印功能。這是導致分段錯誤。從插入功能中刪除free(temp);

+0

我; m到處SEG。這是我所做的: if(head!= NULL)if(head-> next!= NULL)temp-> next = head; } – user3181029

+0

@ user3181029您是否在將頭部傳遞給insert()之前爲頭部分配了內存? – Chinna

+0

是的,但我沒有發佈主功能抱歉,我已經發布它。 這是我的主要功能之後加入頭部並從全局刪除它 – user3181029

0

請注意,您聲明具有相同名稱(頭),但在不同的範圍兩個變量:

struct node* head; 

void insert(struct node* head,int x); 
int main() 
{ 
    struct node* head = (struct node*) malloc(sizeof(struct node)); 

在插入函數取消引用「頭」之前,檢查是否「頭」爲空或不是。總是檢查null並且永遠不要承擔任何事情。 在函數結束時釋放新創建的節點,這也是錯誤的。最後,插入函數的參數不正確,您需要傳遞指針的地址以便能夠更改頭指向的內容。

的功能應該是這個樣子,而不是

void insert(struct node** head,int x) 
{ 
    struct node* temp = malloc(sizeof(struct node)); 
    temp->data = x; 
    temp->next = NULL; 

    assert(head != NULL); // should always be an address 

    if (*head == NULL) 
    { 
    *head = temp; // done, first in list 
    } 
    else // insert as first in list 
    { 
    tmp->next = *head; 
    *head = tmp;  
    } 
} 

,那麼你應該把它想:

insert(&head,x);