0

背景は、リンクされたリストを実装することにより、C でポインターからポインターを試していることです。私の質問は、2 つのコードの違いと、最初のコードでは期待される出力が得られるのに、他のコードでは得られない理由に関するものです。コードの最初の部分が、コード 2 が行うように見える機能の「外部」の先頭に進まないのはなぜですか?

void add_node(int x, Node **head){
if(*head == NULL){
    Node *new_node = (Node*) malloc(sizeof(new_node));
    new_node->x = x;
    *head = new_node;
} else {
    Node *n = *head;

    while(n->next != NULL){
        n = n->next;
    }

    Node *new_node = (Node*) malloc(sizeof(new_node));
    new_node->x = x;
    n->next = new_node;
}
}

4 つの要素を追加し、追加するたびにリストを出力すると、出力は期待どおりになります。12 | 123 | 1234

void add_node(int x, Node **head){
if(*head == NULL){
    Node *new_node = (Node*) malloc(sizeof(new_node));
    new_node->x = x;
    *head = new_node;
} else {
    while((*head)->next != NULL){
        *head = (*head)->next;
    }

    Node *new_node = (Node*) malloc(sizeof(new_node));
    new_node->x = x;
    (*head)->next = new_node;
}
}

出力は次のとおりです。12 | 23 | 34

4

2 に答える 2

2

最初の例では、ポインター n を使用して連結リストを移動しています。これを n->next に割り当てています。これは、まさに連結リストを移動するためにやりたいことです。2 番目の例では、ヘッド ポインターが指している対象を変更しています。

*head = (*head)->next;

基本的に、リンクされたリストの先頭を別のノードに移動しているため、このような動作が発生しています。

于 2015-11-29T21:39:36.657 に答える
0

入力 1、2、3 を評価し、頭部に注目します。

while((*head)->next != NULL){
    *head = (*head)->next;
}
Node *new_node = (Node*) malloc(sizeof(new_node));
        new_node->x = x;
        (*head)->next = new_node;

あなたの出力が描いているどこかに頭を向けたままにします;)

入力 1 と 1,2 の場合、条件が満たされないため、エスケープします。

于 2015-11-29T21:36:17.400 に答える