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) 前のポインタ (「追加」前)、および/または c) 次のポインタ (追加後) のいずれかにアクセスできることを意味します。

于 2013-09-27T04:43:27.460 に答える
0

headref ポインターを更新する必要がある場合に備えて、addNode() に double ポインターを渡します。このような場合、「addNode(headref, 1, 1);」を使用すると、addNode は、addNode() 内の malloced 要素のアドレスを headref に格納する可能性が高くなります。headref をポインターとして渡す場合、呼び出しの後、headref はメインのアドレスを指し続け、malloc されたアドレスを失います。

于 2013-09-27T04:43:27.793 に答える