2013-01-20 57 views
1

這是我在開始時添加節點的代碼。在c的開頭添加節點

void screate(ll *node) 
{ 
    ll *newNode=(ll *)malloc(sizeof(ll)); 
    printf("Enter number :\t"); 
    scanf("%d",&newNode->data); 
    if(newNode->data != NULL) 
    { 
    newNode->next=node; 
    node= newNode; 
    screate(node); 
    } 
    else 
    { 
    free(newNode); 
    newNode=NULL; 
    } 
} 

即使我發現同樣的代碼here,我無法弄清楚,爲什麼我得到錯誤的輸出。

這是當前節點

56->78->77->NULL

但是,當我試圖在開始添加新節點,那麼我依然即56->78->77->NULL得到相同的輸出。需要幫忙 !!

UPDATE

void show(ll *node){ 
while(node->next != NULL) 
{ 
    printf("%d->",node->data); 
    node=node->next; 
} 
printf("NULL"); 
} 
+0

而且你不需要那個演員。 – 2013-01-20 09:34:32

回答

4

您正在分配給node,這只是該函數的一個參數。由於它是按值傳遞的,所以它不會更新調用函數所持有的版本。

您需要將指針傳遞給它,而不是(即ll **node)和更改代碼分配給*node,也變頻器的來電者前面的參數添加&採取其地址。

void screate(ll **node) 
{ 
    ll *newNode=malloc(sizeof(ll)); 
    printf("Enter number :\t"); 
    scanf("%d",&newNode->data); 
    if(newNode->data != NULL) 
    { 
    newNode->next=*node; 
    *node= newNode; 
    screate(node); 
    } 
    else 
    { 
    free(newNode); 
    } 
} 

如果你傳遞一個指針的東西的功能,它可以改變的東西,但不是指針本身。因此,自然的結論是將某事物本身作爲指針 - 即指向指針的指針。

原則上你可以把這個指針鏈接得儘可能深,但實際上你通常不需要比「指向指向東西的指針」更多的東西。

其他幾點。儘量避免使用像lll這樣的變量名,因爲小寫字母L很容易與許多字體中的數字1(和大寫字母I)混淆。此外,您再次使用遞歸調用screate()作爲while循環可能更有效。有些編譯器會發現它是tail-recursive,並且無論如何優化爲一個循環,但我從不喜歡依賴於那種事情,當它首先使用循環時就很清楚。

+0

我是否需要更改show function中的任何內容。因爲它在開始時顯示垃圾值 – Ravi

+0

此更改不應影響只讀取列表的函數,只會影響添加到其開頭的函數(即替換第一個元素)。 – Cartroo

+0

但我不知道,爲什麼它在開始時顯示垃圾值。 :( – Ravi

3
newNode->next=node; 
node = newNode; 

的問題是,node = newNode只更改node這意味着調用者沒有看到改變的本地副本。對於調用者來說,就好像你從不稱呼該功能,node仍然指向之前指向的任何地方。

您可能想通過ll **node並更改*node或其他東西。

+0

我是否也需要改變'show'功能中的任何東西。因爲它在開頭顯示垃圾值 – Ravi

+0

@var___顯示功能正常。添加時您可能做錯了事。 – cnicutar

+0

我遵循了您和@Cartroo提到的相同的代碼。 – Ravi

1

你應該爲指針與參數更改簽名到鏈表指針

void screate(ll **node); 

而且在你的函數的相應的指針更改必須是這樣的

newNode->next=*node; 
*node= newNode; 
screate(&node); 
+0

我做了,現在它在開始時顯示一些垃圾值。 – Ravi

0

我建議改變你的screate函數,以便返回一個struct ll *。返回值將對應於您的新頭節點。

if(newNode->data != NULL)不是一個明智的方式來檢測來自scanf的輸入失敗。實際上,那段代碼是不明智的,時期。 NULL被識別爲一組空指針的成員。 newNode-> data是一個int,而不是指針。將它與0比較會更有意義。 [這裏] [1]是一個標準化的scanf參考。仔細閱讀並回答下列問題,你就會知道如何scanf函數的成功和失敗的區別:

int x, y; 
int z = scanf("%d%d", &x, &y); 
int c = getchar(); 
  1. 如果我發送「ABCD {}輸入」通過標準輸入,究竟會ž是什麼?
  2. 如果我通過stdin發送「abcd {enter}」,那麼c會是什麼?
  3. 如果我通過stdin發送一個EOF信號,scanf將返回什麼?
  4. 如果它成功讀取並將值放入兩個變量x和y中,哪個值是z?