2013-09-27 157 views
0

大家好,我是C的新手,并试图学习它。我有一个关于这个链表实现,我发现在很多地方的简单查询:这是一个很好的习惯吗?

void addNode(node **listhead, int data, int pos){ 
     if(pos<=0 || pos > length(*listhead)+1){ 
       printf("Invalid position provided, there are currently %d nodes in the list \n", length(*listhead)); 
       return; 
     }else{ 
       node *current = *listhead; 
       node *newNode = (node*)malloc(sizeof(node)); 
       if(newNode == NULL){ 
         printf("Memory allocation error\n"); 
         return; 
       } 
       newNode->data = data; 
       newNode->next = NULL; 
       if (current == NULL){ 
         *listhead = newNode; 
         return; 
       }else{ 
         int i = 0; 
         while(current->next != NULL && i < pos-1){ 
           ++i; 
           current = current->next; 
         } 
         if(current->next == NULL){ 
           current->next = newNode; 
         } 
         if(i == pos-1){ 
           newNode->next = current->next; 
           current->next = newNode; 
         } 
       } 
     } 
} 




int main(){ 
     node *head = NULL; 
     node **headref = &head; 
     addNode(headref, 1, 1); 
     addNode(headref, 2, 2); 
     addNode(headref, 3, 3); 
     printList(head); 
     return 0; 
    } 

我的查询是我们在这里创建一个指向它指向NULL指针。此代码有效,但我想知道这是否是一种好的做法。如果不是,我应该如何创建头指针并将其引用传递给addNode函数。

+3

这不是一个链接列表实现。这是一个链表的用法。并且使用NULL指针没有问题(它们出于某种原因在语言中),但是如果没有更多的上下文和实际的**相关**代码,很难分辨出所有这些都在做什么。 – 2013-09-27 04:41:06

+1

如果你不喜欢'headref',你也可以使用'addNode(&head,1,1)'。一般来说,这个代码并没有一个特定的坏习惯。 –

+1

我也用addNode函数更新了代码。感谢回复,我想我明白了,只是对指针有愚蠢的担心。再次感谢。 – user1772218

回答

2

建议的替代:

int main() { 
    node *head = addNode(NULL, 1, 1); 
    node *current = head; 
    current = addNode(current, 2, 2); 
    current = addNode(current, 3, 3); 
    printList(head); 
    return 0; 
} 

换句话说:

1)ADDNODE()成为一个函数,它的电流值作为参数(因此它不必须遍历整个列表只是添加一个新元素)...

2)...并且它返回一个指向新节点的指针。

3)这意味着在程序ANY点后可以任何访问a)该列表头部,b)将前一指针的(前“添加”)和/或c)的下一个指针(加)。

+0

假设addNode被重写为返回添加的节点而不是作为一个外部参数? – WhozCraig

+1

这是我从未想过的事情。感谢上帝,我问。这是非常好的实现。 – user1772218

+1

@ user1772218这是一个完全不同于你的设计。你的目的是为了获得一个列表头,并将一个节点插入一个特定的位置(把它看作一个序号索引)。这不,位置参数是无用的,除非用作'当前'节点的*相对*偏移量。 – WhozCraig

0

我们通过一个双指针addNode()来处理需要更新headref指针的情况。对于这种情况,使用“addNode(headref,1,1);”,addNode很可能会将头中的addNode()内的malloced元素的地址存储在headref中。如果您要将headref作为指针传递,那么在调用headref将继续指向main中的地址之后,您将丢失malloced地址。

0

对于单链表,它实际上是一个很好的做法,它简化了addNode的实现。 我想addNode(node_x, 1, 1)的呼叫会在node_x之前添加一个节点。如果只传递指向node_x的指针。然后该函数将需要循环遍历整个列表并找到node_x之前的节点,并修改其指向新构造节点的指针。而如果你传递一个指向指针的指针,比如说node** p那么这个函数只需要将新节点的地址分配给*p即可。

相关问题