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 函数。

4

3 回答 3

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) 这意味着在程序中的任何点,您都可以访问a ) 列表头,b) 前一个指针(在“add”之前)和/或 c)下一个指针(在 add 之后)。

于 2013-09-27T04:43:27.460 回答
0

对于单链表来说,其实是一种很好的做法,它简化了 addNode 的实现。我猜调用addNode(node_x, 1, 1)之前会添加一个节点node_x。如果您仅将指针传递给node_x. 然后该函数将需要遍历整个列表并找到之前的节点node_x并修改其指向新构造节点的指针。如果您将指针传递给指针,假设node** p函数只需将新节点的地址分配给*p.

于 2013-09-27T04:54:43.883 回答
0

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

于 2013-09-27T04:43:27.793 回答