質問: ### 前提・実現したいこと C言語で,線形リストに対して二分探索をするプログラムを作りたいです. リストはcsvファイルから読み込んで作成します. ### 発生している問題・エラーメッセージ リストを作成(し表示して確認も)するところまでは出来たのですが, 二分探索で使う,リストの先頭・末尾・中央の値をどうやって関数に渡したらいいのかが分からず,リストを作成しただけで作業が止まってしまいました. ### 該当のソースコード ``` #include #include #include #define DATA_FILE "test_search.csv" typedef struct _Node { int data; struct _Node *next; } Node; Node *make_node(void); int make_list(void); int disp_list(void); Node *head; Node *tail; Node *center; //リストの末尾と先頭,中央 int main(void){ make_list();//リスト作成 view_list();//リスト閲覧(確認用) return 0; } //リスト作成 int make_list(void) { Node *p; FILE *fp; char *data_file=DATA_FILE; if((fp=fopen(data_file,"r"))==NULL){ printf("%s can not be open\n",data_file); return 1; } head=NULL; while(p=make_node(),fscanf(fp,"%d",&p->data)!=EOF){ p->next=head; head=p; } return 0; } int view_list(void)//リスト表示(確認用) { Node *p; p=head; printf("\n"); while(p!=NULL){ printf("%d\n",p->data); p=p->next; } return 0; } Node *make_node(void) { return (Node *)malloc(sizeof(Node)); } ``` ### さらに,csvファイルは昇順で並んでいるのですが,このプログラムだと表示するときに降順で表示されてしまいます.何故でしょうか?
回答: > > さらに,csvファイルは昇順で並んでいるのですが,このプログラムだと表示するときに降順で表示されてしまいます.何故でしょうか? > > > headに保存した前のアドレスを新線形(構造体)のnext(次)に登録している事になり、最後のもののアドレスがheadに入ります。 (新)->(旧) 線形の部分のみのサンプルです。 ``` #include #include #include #define DATA_FILE "test_search.csv" typedef struct _Node { int data; struct _Node *next; } Node; Node *make_node(void); int make_list(void); int disp_list(void); Node *head; Node *tail; Node *center; //リストの末尾と先頭,中央 int main(void){ make_list();//リスト作成 view_list();//リスト閲覧(確認用) return 0; } //リスト作成 int make_list(void) { Node *p; FILE *fp; char *data_file=DATA_FILE; if((fp=fopen(data_file,"r"))==NULL){ printf("%s can not be open\n",data_file); return 1; } head=make_node(); p=head; while(fscanf(fp,"%d",&p->data)!=EOF){ p->next=make_node(); tail=p; p=p->next; } tail->next=NULL; free(p); return 0; } int view_list(void)//リスト表示(確認用) { Node *p; p=head; printf("\n"); while(p!=NULL){ printf("%d\n",p->data); p=p->next; } return 0; } Node *make_node(void) { return (Node *)malloc(sizeof(Node)); } ``` 二分探索ですが、真ん中を見つける方法が、線形リストだと良い方法が浮かびませんでした。