2013-09-29 116 views
0

在我正在編寫的程序中,我需要一個鏈表,所以它是一個相當具體的實現。它需要:添加節點到鏈表末尾的函數簽名問題

  1. 將節點添加到結束
  2. 刪除其數據的節點的能力的能力相匹配的指定值

的數據是一個CString,不超過20個字符在長度。我對C不是非常有經驗,並且因以下簽名void addToEnd(llist root, char entery[51])而出現錯誤。我試圖用node替換llist,但是然後錯誤是「未知類型名稱節點」。我怎樣才能擺脫這一點?

這裏的所有示例代碼

#include <stdlib.h> 
#include <string.h> 
#include <stdio.h> 

typedef struct node 
{ 
    char entery[51]; 
    struct node* next; 
} llist; 

/*may be losing root address permanently*/ 
void addToEnd(llist root, char entery[51]) 
{ 
    while(root->next != NULL) 
     root = root->next; 
    node last = malloc(sizeof(struct node)); 
    root->next = last; 
    strcpy(last, entery); 
} 

int main() 
{ 
    struct node *root = malloc(sizeof(struct node)); 
    root->next = NULL; 
    strcpy(root->entery, "Hello"); 

    struct node *conductor = root;//points to a node while traversing the list 

    if(conductor != 0) 
     while(conductor->next != 0) 
      conductor = conductor->next; 

    /* Creates a node at the end of the list */ 
    conductor->next = malloc(sizeof(struct node)); 

    conductor = conductor->next; 

    if (conductor == NULL) 
    { 
     printf("Out of memory"); 
     return EXIT_SUCCESS; 
    } 
    /* initialize the new memory */ 
    conductor->next = NULL; 
    strcpy(conductor->entery, " world\n"); 

    addToEnd(root, " at the"); 
    addToEnd(root, " end"); 

    /*print everything in list*/ 
    conductor = root; 
    if(conductor != NULL) 
    { 
     while(conductor->next != NULL) 
     { 
      printf("%s", conductor->entery); 
      conductor = conductor->next; 
     } 
     printf("%s", conductor->entery); 
    } 

    return EXIT_SUCCESS; 
} 

有一件事我不清楚,是我見過的是他們typedef the struct。爲什麼?讓我詳細說明一下:你怎麼知道你是否想通過nodestruct node。另外我並沒有真正看到這一點,struct node並不比單一的typedef'd名稱長得多。

+0

有了您的typedef,一個'llist'是一樣的'結構節點'... – Sinkingpoint

+0

爲什麼過去的結構節點,節點是類型,爲什麼結構需要? – Celeritas

+0

@Celeritas在'C'中,'struct node'是一個類型,但不是'node'。在其他語言如'C++'中,'somename'等價於'struct somename'。 – starrify

回答

2

問題:

  1. 線12:void addToEnd(llist root, char entery[51])void addToEnd(llist *root, char entery[51])。這裏root必須是一個指針類型,或者你實際上不能在函數內部修改它的值,並使它在函數外部可見。

  2. line 16:node last = malloc(sizeof(struct node));應該是struct node *last = malloc(sizeof(struct node));。由於在C中你必須引用類型名稱和關鍵字struct,它也應該是一個指針,或者它不能用malloc初始化。

至於你typedef的問題,我相信這是可選的,人們用它只是爲了方便。我個人經常在struct上不使用typedef

編輯:

而且你的代碼與錯誤。對不起,我只關注之前的語法。

請注意,malloc用C不向您保證所分配的內存zeored,它實際上可以是任何東西里面。所以,你需要手動填充:以在addToEnd的末尾添加一行last->next = NULL;

+0

好的,謝謝。沒有冒犯,請分享你發現的任何錯誤。 – Celeritas

+0

@Celeritas我已經在後編輯它,這是關於最後所'>下一= NULL;'之一。 :) – starrify

1

要引用您的struct的鏈表,請使用struct node,在typedef之後,您還可以使用llist。您也可以使用,因爲鏈接的問題使用。

typedef struct node 
{ 
    char entery[51]; 
    struct node* next; 
} node; 

在這種風格,你可以使用node一樣struct node

您面臨的語法錯誤是,您誤用了箭頭運算符->,它與指針使用struct。對於struct,使用點操作.

所以對於功能

void addToEnd(llist root, char entery[51]) 
{ 
    while(root->next != NULL) 
     root = root->next; 

你應該傳遞一個指針:

void addToEnd(llist* root, char entery[51])