2013-08-06 45 views
2

我有我創建的代碼鏈接列表C. signly鏈表如下問題:指針的單鏈表指針用C

#include <stdio.h> 
#include <stdlib.h> 
struct node 
{ 
    int data; 
    struct node* next; 
}; 

struct node *mknode(int data) 
{ 
    struct node* np=malloc(sizeof(struct node)); 
    np->data=data; 
    np->next=NULL; 
    return np; 
} 

struct node * insert (struct node* list,int data) 
{ 
    struct node *np; 
    struct node*curr=list; 
    struct node* prev=NULL; 
    np=mknode(data); 
    for(;curr &&data<curr->data;curr=curr->next) 
     prev=curr; 


    np->next=curr; 
    if(prev) 
     prev->next=np; 
    else 
     list=np; 
    return list; 
} 


int main() 
{ 
    struct node* head; 
    head=malloc(sizeof(struct node)); 
    head=insert(head,7); 
    head=insert(head,2); 
    head=insert(head,4); 
    printf("%d",head->data); 
    printf("%d",head->next->data); 
    printf("%d",head->next->next->data); 
    return 0; 
} 

然而,當我互聯網上搜索,我意識到,雙指針用於創建鏈表而不是普通指針。我的意思是,struct node **list,而不是struct node * list。我想知道爲什麼 ?哪一個是正確的,如果他們兩個都是真的,他們之間有什麼區別,我用我在這裏寫的示例主實現了我的實現,它工作正常,但我不知道爲什麼我應該使用指針指針?提前致謝。

+0

'head = malloc(sizeof(struct node));'頭部未正確初始化。 – BLUEPIXY

+0

@PeterMiehle我不認識的問題,你鏈接here.Sorry重複的,但我沒有做重複的目的 – caesar

回答

2

的原因,一些人使用指針的指針,這樣的節點可以不返回新的指針進行更新。在你的例子中,如果你想改變頭指針,你將不得不創建一個新的指針,然後使頭等於該指針。使用雙指針,你只需要釋放第二個指針所指向的空間,然後將第二個指針更新爲新的數據結構,這會保持原始頭指針

我只是在我的實現中使用單指針。

0

這看起來對我來說很好。

所有的指針是,是一個內存地址的地方。雙指針只是指向另一個指向某些數據的內存地址的內存地址。

也許你可以張貼在哪裏看到node **list,我們可以更好地解釋,但現在,你的代碼看起來不錯。

+0

的mknode功能是完全一樣的,但在這裏是使用雙指針插入功能: HTTP://鍵盤.ORG/pYe3sfoM – caesar

0

它是一種位自然,如果調用「頭= NULL;插入(&頭,數據);」然後頭指向第一個元素。應該間接調用所有用於更改內容的函數。但是:這是編碼慣例的問題。有些喜歡它熱,有些喜歡它冷。 head = insert(head,data)的問題;是,這頭是不可用的,當你忘記「頭=」

1

鑑於

struct node { int x; }; 
struct node **pplist; 
struct node *plist; 

pplist是一個指向一個指針指向一個struct node,而plist是指向一個struct node。要改變X,你需要寫

*pplist->x = 3; 
plist->x = 4; 

,如果你想在同一變量指向你會用一個指針的指針,比如說,不同的列表,或者如果你想要一個指針傳遞給函數改變那個指針的副作用。