2015-02-09 55 views
1

我有以下代碼 我「米轉換存儲到鏈接列表字符串 例:ABC A-> B-> C-> NULL字符串鏈表使用雙指針

問題 : 當打印列表中,它是不給所需output.Following是代碼和樣品輸入/輸出

代碼

#include<stdio.h> 
#include<stdlib.h> 
typedef struct node 
{ 
    char ch; 
    struct node *next; 
}node; 
void create(node **head,char ch) 
{ 
    node *new; 
    new=malloc(sizeof(node)); 
    new->next=NULL; 
    new->ch=ch; 
    if(*head==NULL) 
    { 
     *head=new; 
     printf("%c",(*head)->ch); 
     return ; 
    } 
    while((*head)->next) 
    { 
     (*head)=(*head)->next; 
    } 
    (*head)->next=new; 


} 
void printList(node *head) 
{ 
    printf("\nThe list has - "); 
    while(head) 
    { 
     printf("%c",head->ch); 
     head=head->next; 
    } 
    printf("\n\n"); 
} 
int main() 
{ 
    node *head=NULL; 
    int i=0; 
    char *str=NULL; 
    str=malloc(sizeof(char)*15); 
    printf("\nEnter the string - "); 
    scanf("%s",str); 

    while(str[i]!='\0') 
    { 
     create(&head,str[i]); 
     i++; 
    } 
    printList(head); 
    return 0; 
} 

採樣輸入/輸出

輸入1

Enter the string - abc 
a 
The list has - bc 

輸入2

Enter the string - abcde 
a 
The list has - de 

輸入3

Enter the string - ab 
a 
The list has - ab 

注:

如果我改變我的創造功能,這一點,一切都只是正常工作! 我想知道這裏有什麼區別? 它與雙指針有關嗎?

void create(node **head,char ch) 
{ 
    node *new,*ptr; 
    new=malloc(sizeof(node)); 
    new->next=NULL; 
    new->ch=ch; 
    ptr=*head; 
    if(ptr==NULL) 
    { 
     ptr=new; 
     return; 
    } 
    while(ptr->next) 
    { 
     ptr=ptr->next; 
    } 
    ptr->next=new; 

} 

謝謝!

+1

你沒有描述所需的輸出 – user590028 2015-02-09 17:44:42

+0

@ user590028是不是很明顯..我說我試圖將字符串複製到鏈接列表。 – psychoCoder 2015-02-09 18:29:24

回答

3

有在第一代碼剪斷你插入功能的問題,即你的時候移動*head,所以你插入的最後一個節點到頭部的最後一個節點

a->b->c->d 
     | 
     | 

Head is at c now 
前指向一個列表

所以你不應該移動頭部,只使用臨時變量來獲得頭部的值和移動溫度。

a->b->c->d 
|  | 
|  | 
Head temp 

有它的東西做的雙指針?

不,它只是在第二個片段中使用ptr作爲臨時指針,並且不會移動您的代碼,如上所示。

+0

由於我在while循環中使用了條件'(* head-> next)',因此當'(* head)'應該指向'd'並且'(* head-> next = NULL)'。當head指向'c'時,爲什麼循環會退出? – psychoCoder 2015-02-09 18:43:47

+1

@NitinPandey當(* head)指向c'(* head) - > next = NULL' ..這就是當你繼續前進並添加一個節點(d),所以現在你的'* head'呆在那裏..明白了? – Gopi 2015-02-09 18:45:23

+0

哦!是的是的..我在想什麼?得到它了 !謝謝 – psychoCoder 2015-02-09 19:39:16

0

Gopi已經指出了你的代碼的問題。如果區分將第一個節點插入空列表的兩種情況(在這種情況下,您必須更新head)並將其附加到現有列表,您可以使用該建議來插入新節點。 (您已經看到了兩種情況。)

但是指針指針策略增加了一個間接級別,您可以在這裏使用這個級別,但沒有區分:head保存指向頭節點的指針。如果使用head來遍歷列表,則head應始終指向指向當前節點的指針。如果當前節點是NULL,指定新的節點,即覆蓋指針:

void create(node **head, char ch) 
{ 
    /* create new node */ 
    node *nd = malloc(sizeof(*nd)); 
    nd->next=NULL; 
    nd->ch=ch; 

    /* advance to end of list */ 
    while (*head) { 
     head = &(*head)->next; 
    } 

    /* assign */ 
    *head = nd; 
} 

順便說一句,你的第二個功能不工作得很好,因爲你永遠不更新的頭。你會得到一個空列表和內存泄漏。

+0

它的工作原理是,我永遠不會改變頭部,並使用臨時指針'ptr'遍歷列表,並在最後插入。那麼這種方法有什麼問題嗎? – psychoCoder 2015-02-09 18:33:24

+0

當我運行你的代碼並用上一段代碼中的代碼替換'create'函數時,我得到了我期望的結果:一個空的列表。用臨時指針遍歷列表是可以的,因爲您不會更改列表。但是,當列表可以更改時,您必須反映更新。這裏至關重要的情況是,當你將第一個節點添加到一個空列表時:'head'必須改變;插入後不能爲NULL。之後,你的方法就可以工作,因爲你改變了節點結構中的一個值。 – 2015-02-09 20:05:26

+0

噢,我有一個不同的代碼,你是對的,我忘了在第二個代碼片段的'(ptr == NULL)'部分中放置'* head = new'。在我的筆記本電腦上,我在那裏工作!剛纔注意到了 – psychoCoder 2015-02-10 06:04:58