2013-08-06 265 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; 

,如果你想在同一变量指向你会用一个指针的指针,比如说,不同的列表,或者如果你想要一个指针传递给函数改变那个指针的副作用。