2016-03-30 61 views
0

我看過很多不同的在線問題,無法弄清楚我做錯了什麼。我現在可能會走錯方向,因爲我嘗試了很多不同的東西。C Simple LinkedList

我只是想在C中做一個簡單的單鏈表。我似乎無法弄清楚如何使列表保持連接。

我節點的結構

typedef struct node 
{ 
    double x;   // x-coordinate of this point in the tour 
    double y;   // y-coordinate of this point in the tour 
    struct node* next; // Pointer to the next node in the linked list 
} Node; 

這是我的代碼,使名單,我建一個空的節點在主

Node* addFront(Node* first, double x, double y) { 

    first = malloc(sizeof(Node)); 
    if (first == NULL) { 
     first->x = x; 
     first->y = y; 
     first->next = NULL; 
    } 
    else { 
     Node * temp = malloc(sizeof(Node)); 
     temp->x = x;   
     temp->y = y;      
     temp->next = first;     
     first = temp;  
    } 
    //Temp testing 
    int size = 0; 
    Node * current = first; 
    while (current->next != NULL) { 
     printf("(%.4f, %.4f)\n", current->x, current->y); 
     current = current -> next; 
     size++; 
    } 
    printf("Size: %d\n", size); 

    return first; 
} 

的一些注意事項第一= NULL:

檢查第一個是否爲空應該是不必要的......該列表應該能夠使用else語句來構建。 (我的想法)

添加if/else語句後,我得到了什麼似乎是一個無限循環與C只是指向隨機存儲器,最終導致分段故障。

我只是不知道在哪裏可以找到。先進的謝謝你!

+1

塊'如果(第一== NULL){...}'沒有按」沒有意義。如果'first'是'NULL',則不能執行'first-> x = x;'等等。這只是說,'malloc'在分配內存之前失敗了。 – pzaenger

回答

4

此塊沒有任何意義可言:

first = malloc(sizeof(Node)); 
if (first == NULL) { 
    first->x = x; 
    first->y = y; 
    first->next = NULL; 
} 

也許你想移動first = malloc(sizeof(Node));塊內。它可以工作,但是這完全沒有必要,因爲它在邏輯上等於else塊。所以,你可以離開只是有第二塊:

Node * temp = malloc(sizeof(Node)); 
    temp->x = x;   
    temp->y = y;      
    temp->next = first;     
    first = temp; 
    return first; 
    // or rather return temp directly 

還有一個點 - 你應該添加錯誤辦案malloc耗盡內存,所以你應該檢查temp == NULL並採取相應的行動(從函數返回NULL管他呢...)。

+0

非常感謝。我想如果沒有if語句,我確實沒有錯,我必須跳過槍並沒有對它進行測試。 –

0

對於初學者來說,即使函數的第一個語句是錯誤的,因爲參數first的值被覆蓋。

Node* addFront(Node* first, double x, double y) { 

    first = malloc(sizeof(Node)); 
    //... 

功能可以看看下面的方式

Node * addFront(Node *first, double x, double y) 
{ 
    Node *temp = malloc(sizeof(Node)); 

    if (temp != NULL) 
    { 
     temp->x = x;   
     temp->y = y;      
     temp->next = first;     

     first = temp; 
    } 

    return first; 
} 

或者與測試代碼

Node * addFront(Node *first, double x, double y) 
{ 
    Node *temp = malloc(sizeof(Node)); 

    if (temp != NULL) 
    { 
     temp->x = x;   
     temp->y = y;      
     temp->next = first;     

     first = temp; 
    } 

    // start pf inline test 
    size_t size = 0; 

    for (Node *current = first; current != NULL; current = current->next) 
    { 
     printf("(%.4f, %.4f)\n", current->x, current->y); 
     ++size; 
    } 
    printf("Size: %zu\n", size); 
    // end pf inline test 

    return first; 
}