- ベストアンサー
リストの昇順挿入プログラムがうまくいかない
- リストに昇順になるように入力された要素を挿入するプログラムが正しく動作していません。どうか教えてください。
- プログラムは要素をリストに挿入し、挿入後のリストを表示する処理が含まれています。
- プログラムの挿入処理において、リストの要素を適切な位置に挿入する方法を解説しています。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
#2です。 すいません、一カ所間違えて いました。 count--; を count -= 2; に修正してください。 最初に、無条件に1加算しているので、削除した場合は2を引かないと、結果的に1引いたことになりません。 リスト処理は、なれるまでは大変でしょうが、リスト処理を押さえておけば、結構役に立つと思います。がんばってください。
その他の回答 (2)
- tatsu99
- ベストアンサー率52% (391/751)
以下のようにしてください。 今回追加した部分にコメントをいれてあります。 ------------------------------- #include<stdio.h> #include<stdlib.h> static int count = 0; struct node_tag{ int data; struct node_tag *next; }; typedef struct node_tag node_t; node_t *insert_node( node_t *t, int d ); node_t *print_list( node_t *r ); int main( void ) { node_t root; int data; root.next = NULL; for ( ;; ) { printf( "> " ); if ( scanf( "%d", &data ) != 1 ) break; insert_node( &root, data ); print_list( &root ); } return; } node_t *insert_node( node_t *t, int d ) { node_t *new_node; node_t *prev_node; new_node = (node_t *)malloc( sizeof(node_t) ); if( new_node == NULL ) return NULL; new_node->data = d; count++; if(count == 1) { new_node -> next = NULL; t -> next = new_node; return new_node; } prev_node = t; t = t->next; for(;t != NULL;t = t->next) { //追加開始 if (t->data == d) { prev_node->next=t->next; free(t); count--; return NULL; } //追加終了 if (t->data > d) { prev_node->next = new_node; new_node->next = t; return new_node; } prev_node = t; } new_node->next = NULL; prev_node->next = new_node; return new_node; } node_t *print_list( node_t *r ) { node_t *p; printf("[ "); for( p = r -> next; p != NULL; p = p -> next) { printf("%d ", p -> data); } printf("]\n"); return NULL; }
- tatsu99
- ベストアンサー率52% (391/751)
変更した箇所へコメントを入れました。 --------------------------------- #include<stdio.h> #include<stdlib.h> //追加 static int count = 0; // 修正 struct node_tag{ int data; struct node_tag *next; }; typedef struct node_tag node_t; node_t *insert_node( node_t *t, int d ); node_t *print_list( node_t *r ); int main( void ) { node_t root; int data; root.next = NULL; for ( ;; ) { printf( "> " ); if ( scanf( "%d", &data ) != 1 ) break; insert_node( &root, data ); print_list( &root ); } return; } node_t *insert_node( node_t *t, int d ) { node_t *new_node; node_t *prev_node; //追加 new_node = (node_t *)malloc( sizeof(node_t) ); if( new_node == NULL ) return NULL; //ここから変更開始 new_node->data = d; count++; if(count == 1) { new_node -> next = NULL; t -> next = new_node; return new_node; } prev_node = t; t = t->next; for(;t != NULL;t = t->next) { if (t->data > d) { prev_node->next = new_node; new_node->next = t; return new_node; } prev_node = t; } new_node->next = NULL; prev_node->next = new_node; return new_node; //ここで変更終了 } node_t *print_list( node_t *r ) { node_t *p; printf("[ "); for( p = r -> next; p != NULL; p = p -> next) { printf("%d ", p -> data); } printf("]\n"); return NULL; //とりあえずNULLを返す 追加 }
補足
ご回答ありがとうございます。 ついでにもうひとつ教えていただけるとありがたいのですが、*insert_node関数内のforループを次のようにして、 for(; t != NULL; t = t -> next) { if(t -> data == d)//新たに追加 { remove_node( prev_node ); return NULL; }//ここまで else if(t -> data > d) { prev_node -> next = new_node; new_node -> next = t; return new_node; } prev_node = t; } 一度入力された数字が入力されるとリストから削除する下の関数を追加したいのですが、うまくいきません。 再びよろしくお願いします。 void remove_node( node_t *n ) { node_t *old_node; if(n -> next = NULL) return; old_node = n -> next; n -> next = old_node -> next; free( old_node ); }
お礼
リスト処理の課題に困っていたのですが、おかげで解くことができました! 度重なる質問に答えていただき本当にありがとうございました!