2016-09-23 12 views
0

私は昨夜私のCコードで奇妙な動作を見つけました。 Cのリンクリストを作成して操作するための基本関数がいくつかあります。 n番目の位置での挿入の動作は奇妙です。リンクされたリストの挿入動作

最初のバージョンは正常に動作しますが、2番目のバージョンはリストにまったく挿入されません。何か不足していますか?

//This works fine 
void insert_nth(struct node** head, int data, int n_pos){ 
    if (n_pos == 0){ 
     insert_top(head, data); 
     return; 
    } 
    struct node* current = *head; 
    for(int i = 0; i < n_pos - 1 ; i++){ 
     if(current == NULL) return; 
     else current = current->next; 
    } 
    if(current == NULL) return; 
    insert_top(&(current->next), data); 
} 

//This doesn't insert at all 
void insert_nth(struct node** head, int data, int n_pos){ 
    if (n_pos == 0){ 
     insert_top(head, data); 
     return; 
    } 
    struct node* current = *head; 
    for(int i = 0; i < n_pos ; i++){ 
     if(current == NULL) return; 
     else current = current->next; 
    } 
    if(current == NULL) return; 
    insert_top(&(current), data); 
} 

私が参考にしている残りの機能は以下のとおりです。

int main(){ 
    struct node* head = NULL; 
    build_rand_list(&head); 
    list_print(&head); 
    return 0; 
} 

void list_print(struct node** head){ 
    printf("List size is %d: List: ", list_length(head)); 
    for(struct node* current = *head; current!= NULL; current = current->next) 
     printf("%d ", current->data); 
    printf("\n"); 
} 

void build_rand_list(struct node** head){ 
    //Assume head is NULL 
    assert(*head == NULL); 
    srand(time(NULL)); 
    for (int i = 0; i < 10; i++){ 
     int random_num = rand() % 11; 
     insert_end(head, random_num); 
    } 
} 

void insert_top(struct node** head, int data){ 
    struct node *new_node = (struct node *)malloc(sizeof(struct node)); 
    new_node->data = data; 
    new_node->next = *head; 
    *head = new_node; 
} 
+0

デバッグしようとしましたか? –

答えて

1

&(current)は、ローカル変数のアドレスです。
&(current->next)は、リスト内のノード内のポインタのアドレスです。

ローカル変数current(これは最終的にはinsert_topとなります)の変更は、リストのノードには影響しません。例えば

+0

ああ、意味があります。ありがとう! – KDN

0

あなたはinsert_top関数に値2を持つノードを渡す場合、結果はあなたが正しくポインターを処理しないように思えこの

Linked list pointers

のようなものになります。たとえば、作成した新しいノードを指すノードはありません。

より良い実装がheadパラメータがリストの実際のヘッドである

void insert_nth(struct node *head, int data, int npos) { 
    struct node *current = head; 

    for (int i = 0; i < npos - 1; i++) { 
     current = current->next; 

     if (current == null) { 
      printf("%s\n", "Insert failed"); 
      return; 
     } 
    } 

    struct node *new_node = (struct node *)malloc(sizeof(struct node *)); 
    new_node->data = data; 
    new_node->next = current->next; 
    current->next = new_node; 

    return; 
} 

だろう。 結果は私より満足しています。お役に立てれば。

Correct linked list pointers

関連する問題