線形リストのソートについて

このQ&Aのポイント
  • データ構造を線形リストとして、情報を管理するプログラムのソートについてです。
  • 線形リストをつなぎ替えるようにしてソートを行うプログラムを作成したいですが、方法がわかりません。
  • 構造体の宣言として、nameとageとnextは氏名と年齢と次のポインタを指します。
回答を見る
  • ベストアンサー

線形リストのソートについて

データ構造を線形リストとして、情報を管理するプログラムのソートについてです。 以下のプログラムはデータを入れ替えて、その後アドレスを入れ替えるようにしてソートを行っていますが、そうではなく線形リストなのでつなぎ替えるようにしてソートを行うプログラムを作成したいのですがわからないのでご教授をお願い致します。ソートは逐次決定で行ってます。 構造体の宣言として、nameとageとnextは氏名と年齢と次のポインタを指します。NAME_SORT、AGE_SORTはマクロです。 struct sortlist(struct PERSON *head) { int menu; struct PERSON person; /* 情報 */ struct PERSON move_person; /* 比較していく情報 */ struct PERSON work; /* 情報の一時的保存 */ struct PERSON temp; /* 作業用 */ struct PERSON temp_address; /* アドレス作業用 */ printf("ソート機能を選択:"); printf("%d:氏名\n",NAME_SORT); printf("%d:年齢\n",AGE_SORT); /* 交換処理 */ for(person = head; person -> next != NULL; person -> person -> next) { work = person; /* 交換データの探索 */ for(move_person = person -> next; move_person != NULL; move_person -> next) { switch(menu) { case NAME_SORT: if(strcmp(work -> name, move_person -> name) > 0) { work = move_person; } break; case NAME_SORT: if(work -> age > move_person -> age) { work = move_person; } break; default: printf("機能以外が選択されました"); return head; } if(work != person) { /* 情報の交換 */ temp = *person; *person = *work; *work = temp; /* アドレスの交換 */; temp_address = employee -> next; person -> next = work -> next; work -> next = temp_address; } } } } printf(“ソート完了”); }

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.6

#5のようにいちいち先頭から検索してソートしてたんじゃ…と思ったので、 いったんポインタの配列にしてソートしてからリストを再構成する方法 ---------------------------------------------------------------- #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct person { char *name; int age; struct person *next; } PERSON ; int listlen(PERSON *head){ int len=0; PERSON *p; for(p=head;p!=NULL;p=p->next) len++; return len; } void addlist(PERSON *head, PERSON *el){ //headが示すリストの最後に追加する PERSON *p; for(p=head;p->next!=NULL;p=p->next) ; p->next=el; } void printlist(PERSON *head){ PERSON *p; for(p=head;p!=NULL;p=p->next) printf("氏名:%s\t年齢:%d\n", p->name, p->age); } #define NAME_SORT 1 #define AGE_SORT 2 int cmp1(const void *a, const void *b){ return (strcmp((*((PERSON**)a))->name, (*((PERSON**)b))->name)); } int cmp2(const void *a, const void *b){ return ((*((PERSON**)a))->age - (*((PERSON**)b))->age); } void sortlist(PERSON **head) { //リストを配列にしてソート、その結果でリストを再構成する int menu=0; int size; int i; PERSON **persons; PERSON *p; size=listlen(*head); persons=(PERSON**)malloc(size*sizeof(PERSON*)); if(persons==NULL){ printf("メモリ不足のためソートできませんでした"); return ; } for(i=0,p=*head;p!=NULL;p=p->next) persons[i++]=p; //ポインタの配列にする redo: printf("ソート機能を選択:\n"); printf("%d:氏名\n", NAME_SORT); printf("%d:年齢\n", AGE_SORT); printf("select:"); scanf("%d%*c", &menu); if(menu != NAME_SORT && menu != AGE_SORT){ printf("機能以外が選択されました\n"); goto redo; } switch(menu){ case NAME_SORT: qsort(persons, size, sizeof(PERSON*), cmp1); break; case AGE_SORT: qsort(persons, size, sizeof(PERSON*), cmp2); break; } *head=persons[0];//1つはデータがある?ホントに? for(i=1;i<size;i++) persons[i-1]->next=persons[i]; persons[size-1]->next=NULL; free(persons); printf("ソート完了\n"); } void main(void){ PERSON *head; PERSON a ={ "AKANE", 20, NULL }; PERSON b ={ "BLUE" , 25, NULL }; PERSON r ={ "RED" , 68, NULL }; PERSON g ={ "GREEN", 12, NULL }; head=&a; addlist(head, &b); addlist(head, &r); addlist(head, &g); printlist(head);//ソート前のリスト sortlist(&head);//head自体が書き換わる可能性がある printlist(head); }

rio_de_car
質問者

お礼

たびたびありがとうございます^^ こちらのほうも参考にさせて頂きます。 どうしたらよいのか困っていたんですが、本当に迅速かつ丁寧に対応して頂いて感謝致します。 こちらを参考にさせて頂き自分なりに考えてみます。 また、お願いします。

その他の回答 (6)

回答No.7

リストだと挿入ソートとかマージソートとかの方がいいんでないですかね。

rio_de_car
質問者

お礼

回答ありがとうございます。 そうですね。挿入ソートやマージソートもあるんですが、自分がはじめに逐次決定でやったのでそのまま修正したかったんです。 また、挿入ソートやマージソートも勉強したいと思います。 ありがとうございます。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.5

とりあえず、文句を言っててもしょうがないので、サンプルを作ってみました。 (#3の補足を見る前だったので、#3の補足には合わせていません) (他にもやりようがあるかもしれませんが、とりあえず動くもの) ---------------------------------------------------------------- #include <stdio.h> #include <string.h> typedef struct person { char *name; int age; struct person *next; } PERSON ; void addlist(PERSON *head, PERSON *el){ //headが示すリストの最後に追加する PERSON *p; for(p=head;p->next!=NULL;p=p->next) ; p->next=el; } void printlist(PERSON *head){ PERSON *p; for(p=head;p!=NULL;p=p->next) printf("氏名:%s\t年齢:%d\n", p->name, p->age); } #define NAME_SORT 1 #define AGE_SORT 2 int cmp(PERSON *a, PERSON *b, int kind){ switch(kind){ case NAME_SORT: return (strcmp(a->name, b->name)); case AGE_SORT: return (a->age > b->age); } return 0;//DUMMY } void swap(PERSON **head, PERSON *a, PERSON *b){ //headからのリストでaとbを入れ替える //リストの並びはaが先でbが後 //head自体が書き換わる可能性がある PERSON *p; //リストの中のnext情報の書き換え for(p=*head;p->next!=NULL;p=p->next){ if(p->next==b){ p->next=a; break; } } if(*head!=a){ for(p=*head;p->next!=NULL;p=p->next){ if(p->next==a){ p->next=b; break; } } } else { //headの交換 *head=b; } //リンクの交換 p=a->next; a->next=b->next; b->next=p; } void sortlist(PERSON **head) { int menu=0; PERSON *person; PERSON *move_person; /* 交換候補 */ PERSON *work; redo: printf("ソート機能を選択:\n"); printf("%d:氏名\n", NAME_SORT); printf("%d:年齢\n", AGE_SORT); printf("select:"); scanf("%d%*c", &menu); if(menu != NAME_SORT && menu != AGE_SORT){ printf("機能以外が選択されました"); goto redo; } for(person=*head; person->next!=NULL; person=person->next) { work=person; for(move_person=person->next;move_person!= NULL;move_person=move_person->next){ if(cmp(work, move_person, menu)>0){ work=move_person; } } if(work != person) { /* 交換 */ swap(head, person, work); person=*head;//リストの構成が変化したのでやり直し } } printf("ソート完了\n"); } void main(void){ PERSON *head; PERSON a ={ "AKANE", 20, NULL }; PERSON b ={ "BLUE" , 25, NULL }; PERSON r ={ "RED" , 68, NULL }; PERSON g ={ "GREEN", 12, NULL }; head=&a; addlist(head, &b); addlist(head, &r); addlist(head, &g); printlist(head);//ソート前のリスト sortlist(&head);//head自体が書き換わる可能性がある printlist(head); }

rio_de_car
質問者

お礼

わざわざサンプルをお付けして頂いてありがとうございます。 是非参考にさせていただきます。 ありがとうございました。

rio_de_car
質問者

補足

たびたび失礼します。 あと僕が書いたプログラムのソート関数の部分で構造体ポインタの宣言するところですべてにおいて*をつけ忘れておりましたペコリ(o_ _)o)) 間違いが多くてすみません。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

#2>コンパイル実行自体には問題がない うそ! 目で見ただけでも、ポインタとポインタでないものがごっちゃになってる 例えば、 >struct sortlist(struct PERSON *head) { >for(person = head; person -> next != NULL; person -> person -> next) { で、 >person = head ポインタじゃないpersonにポインタであるheadを入れてる >person -> person -> next 参照できないはず menuに値が設定されていない。 諸々 まともなコンパイラでまともにコンパイルできないはず

rio_de_car
質問者

お礼

返信ありがとうございます。 確かにそうですね。ポインタじゃないのにポインタであるもの入れてありますね。 プログラム自体に問題がありますね><すみませんです。

rio_de_car
質問者

補足

あとすいません。 person = person -> nextの間違えでした>< 打ち間違えまいたぺこ <(_ _)>

  • nk2
  • ベストアンサー率23% (6/26)
回答No.3

PERSON構造体の中身を見せろ。 お前の打ちかけソースより、元々もソースを見せろ。 返値にstructってなんだよ。

rio_de_car
質問者

お礼

返信ありがとうございます。 すいません。質問の文字数が限られててソースが全部書けなかったのです。 なので絞って書きました。 今から補足のとこに書かさせていただきます。

rio_de_car
質問者

補足

ソースが長すぎて収まりきらないので、メインとソート部分のみ書かさせてもらいました。 また、EMPLOYEE構造体に書き直しました。 #include <stdio.h> #include <string.h> #include <stdlib.h> /* メニュー番号 */ #define REGIST 1/* 登録 */ #define LIST 2/* 一覧表示 */ #define DELETE 3/* 削除 */ #define SORT 4/* ソート */ /* 終了メニュー */ #define YES 1/* 終了する */ /* ソート番号 */ #define NAME_SORT 1/* 名前順 */ #define AGE_SORT 2/* 年齢順 */ #define ADDRESS_SORT 3/* 住所順 */ /* 配列の要素数 */ #define NAME_LENGTH 20/* 氏名 */ #define SECTION_LENGTH 10/* 所属 */ #define ADDRESS_LENGTH 255/* 住所 */ struct EMPLOYEE { /* 社員情報 */ int number; /* 登録番号 */ char name[NAME_LENGTH]; /* 氏名 */ int age; /* 年齢 */ char section[SECTION_LENGTH]; /* 所属 */ char address[ADDRESS_LENGTH]; /* 住所 */ struct EMPLOYEE * next; /* 次の情報 */ }; struct EMPLOYEE * list_regist(struct EMPLOYEE *, int *); void list_print(struct EMPLOYEE *); struct EMPLOYEE * list_delete(struct EMPLOYEE *); struct EMPLOYEE * list_sort(struct EMPLOYEE *); void list_free(struct EMPLOYEE *); void main() { struct EMPLOYEE * head; /* 社員情報 */ int menu; /* 入力された項目 */ int flag = 1; /* 継続フラグ */ int number = 1; /* 登録番号 */ head = NULL; /* 処理を実行 */ while (flag) { /* 行う処理の入力 */ printf("\n%d: 登録 %d: 一覧表示 %d: 削除 %d: ソート\n", REGIST, LIST, DELETE, SORT); printf("(終了の場合は上の数字にない数字を押してEnter)\n"); printf("該当項目の入力 -> "); scanf("%d", & menu); /* 入力された文字から処理を判別 */ switch (menu) { case REGIST: head = list_regist(head, & number); break; case LIST: list_print(head); break; case DELETE: head = list_delete(head); break; case SORT: head = list_sort(head); break; default: printf("\n終了しますか?\n"); printf("%d: 終了する\n", YES); scanf("%d", & menu); /* 本当に終了するかの確認 */ if (menu == YES) { flag = 0; } } printf("\n"); } printf("flag: %d\n", flag); list_free(head); } /* ソーと関数 */ struct list_sort(struct EMPLOYEE *head) { int menu; struct ENPLOYEE employee; /* 情報 */ struct ENPLOYEE move_employee; /* 比較していく情報 */ struct ENPLOYEE work; /* 情報の一時的保存 */ struct ENPLOYEE temp; /* 作業用 */ struct ENPLOYEE temp_address; /* アドレス作業用 */ printf("ソート機能を選択:"); printf("%d:氏名\n",NAME_SORT); printf("%d:年齢\n",AGE_SORT); printf("%d:住所\n",ADDRESS_SORT); /* 交換処理 */ for(employee = head; employee -> next != NULL; employee -> employee -> next) { work = employee; /* 交換データの探索 */ for(move_employee = employee -> next; move_employee != NULL; move_employee -> next) { switch(menu) { case NAME_SORT: if(strcmp(work -> name, move_employee -> name) > 0) { work = move_employee; } break; case NAME_SORT: if(work -> age > move_employee -> age) { work = move_employee; } break; case ADDRESS_SORT: if(strcmp(work -> address, move_employee -> address > 0) { work = move_employee; } break; default: printf("機能以外が選択されました"); return head; } if(work != employee) { /* 情報の交換 */ temp = *employee; *employee = *work; *work = temp /* アドレスの交換 */; temp_address = employee -> next; employee -> next = work -> next work -> next = temp_address; } } } } printf(“ソート完了”); }

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

これ、動いているプログラムじゃないよね?

rio_de_car
質問者

お礼

返信ありがとうございます。

rio_de_car
質問者

補足

機能としては、登録、一覧表示、削除、ソートを行うようにしています。 そこでソートでのプログラムで、コンパイル実行自体には問題がないのですが、このプログラムを単方向リストとなるかといったら、中身のデータを入れ替えて、次にアドレスを入れ替えてるだけなので、データ数が多くなればその分不都合であると思われるので、修正したいのですが、思いつかなくて・・・。 なので投稿してみたんですが^^

回答No.1

employeeってナンダ? 一気に全部やろうとすると絶対に混乱する。 ので、問題を切り分けよう。 この場合だと……リストの並び替えだけするプログラムを書いてみてはどうだろう。

rio_de_car
質問者

お礼

返信ありがとうございます。

rio_de_car
質問者

補足

すいません。 employeeじゃなくてpersonでした。 リストの並び替えだけするプログラム・・・ 並び替えは情報の交換のところでできると思うんですけどだめですか???

関連するQ&A

  • C言語でリストのソートについて質問します。以下のmain()文を用いた

    C言語でリストのソートについて質問します。以下のmain()文を用いた昇順、降順のソートを行いたいのですが、何度やってもうまくいくアルゴリズムが組めません。アドバイスお願いします。 void main() { struct *head; head = NULL; head = add_ans(5,head); head = add_ans(4,head); head = add_ans(3,head); head = add_ans(2,head); head = add_ans(1,head); show_ans(head); head = sort_up(head); show_ans(head); head = sort_down(head); show_ans(head); } 以下自作のソートです。穴だらけですが… struct ans *sort_up(struct ans *head) { struct ans *info; struct ans *move_info; struct ans *keep; struct ans *temp; for(info = head; info->next!=NULL; info=info->next) keep = info; for(move_info = info->next; move_info!=NULL; move_info->next) { if(info > info->next) { temp = info->next; info->next = info; info = temp; head = info; } } return head; }

  • C言語のリストのソートについて質問します。

    C言語のリストのソートについて質問します。 こんばんは、aida13です。以前の質問が自己解決しました。回答者のみなさん本当にすみませんでした。 今回はそのアルゴリズムで改善したい点がありましたので投稿させていただきました。以下のソートを実行するとソート自体はうまくいくのですが、見ての通りwhileやifなどを使って何度も実行しなおさないと完全にソートできません(「5 4 3 2 1」→「4 3 2 1 5」(一回ソート))。これを一回でソートできるようにしたいのです。また、降順も同様にそのままsecondとheadを入れ替えたのですが…今度は何度やっても「1 2 3 4 5」→「2 1 3 4 5」(一回ソート)からそれ以上動きません。アドバイスをお願いします。また、出来る限りこの形を保てる形でお願いします。 以下自作ソート #include < stdio.h > #include < stdlib.h > struct ans { int data; struct ans *next; }; struct ans *sort_up(struct ans *head) { int temp; struct ans *second_head; second_head = (struct ans *)malloc(sizeof(struct ans)); second_head = head->next; if( head->next == NULL ) { return head; } else { if( head->data > second_head->data ) { temp = head->data; head->data = second_head->data; second_head->data = temp; sort_up(head->next); } else { sort_up(head->next); } return head; } } struct ans *add_list(int x, struct ans *head) { struct ans *new_head; new_head = (struct ans *)malloc(sizeof(struct ans)); new_head->data = x; new_head->next = head; return new_head; } void show_list(struct ans *head) { if( head == NULL ) { printf("\n\n"); } else { printf("%d ",head->data); show_list(head->next); } } void main() { struct ans *head; head = NULL; head = add_list(1,head); head = add_list(2,head); head = add_list(3,head); head = add_list(4,head); head = add_list(5,head); do { printf("input:"); scanf("%d",&a); if(a==0) { head = sort_up(head); show_list(head); } } while(a==0); }

  • アルゴリズム 線形リスト

    最近リストについて習い始めました。入力したデータと同順に並ぶリストを作成しようと思い、コードを打ったのですが…動作中止の表示がでてしまいました。どこが間違っているのか、ずっと悪戦苦闘して組んでいるのですが、全く出口が見えてきません。何が間違えているのか、はたまた根本的に違うのか、ご指導して頂けると有難いです。 以下、コードです。 #include <stdio.h> #include <stdlib.h> #include <string.h> struct hito{ char name[20]; int age; struct hito *next; }; void main(void){ struct hito *p, *head, *dummy; char new_name[20]; int new_age; dummy = (struct hito *)malloc(sizeof(struct hito)); head = dummy; dummy->next = p; dummy = p; while (scanf("%s %d" , new_name, &new_age) != EOF) { p = (struct hito *)malloc(sizeof(struct hito)); strcpy(p->name, new_name); p->age = new_age; p->next = head; head = p; } while(p != NULL) { printf("\t%-20s %3d\n" , p->name, p->age); p = p->next; } }

  • 双方向リストのバブルソートについて

    双方向リストをバブルソートを用いてソートしたいです。 下記がプログラム(一部)ですが、ソートした後にリスト表示すると 無限ループに陥ります。 どこがいけないのでしょうか。 #include <stdio.h> #include <stdlib.h> struct cell{ int data; struct cell *next, *prev; }; void insert_head(struct cell **head, int num){ struct cell *p, *p1; p = *head; p1 = make_cell(); *head = p1; p1->data = num; p1->next = p; if(p1->next != (struct cell *)NULL){ p1->next = p; p->prev = p1; } } void print_list(struct cell *head){ struct cell *p; p = head; printf("data = \n"); while(p != (struct cell *)NULL){ printf("%d\n", p->data); p = p->next; } } void sort_list(struct cell **head){ struct cell *p, *p2; int i, n; n = 0; p = *head; while(p->next != (struct cell *)NULL){ p = p->next; n++; } for(i = 0, p = *head; i < n-2; i++){ if(p->data > p->next->data){ if(p == *head){ *head = p->next; }else{ p->prev->next = p->next; } p2 = p->next; p->next = p->next->next; p->next->next = p; p->next->next->prev = p; p->next->prev = p->prev; p->prev = p2; }else p = p->next; } } int main(void){ struct cell *head = (struct cell *)NULL; int n; while(1){ printf("1:Insert head 2:Insert tail 3:Delete 4:List 5:Sort 6:Exit\n"); scanf("%d", &n); switch(n){ case 1: printf("num = "); scanf("%d", &n); insert_head(&head, n); break; case 2: printf("num = "); scanf("%d", &n); insert_tail(&head, n); break; case 3: printf("num = "); scanf("%d", &n); delete_cell(&head, n); break; case 4: print_list(head); break; case 5: sort_list(&head); break; case 6: return 0; break; } } }

  • リストの削除について(構造体)

    リストの削除のプログラムを実行して行ってみると、リストの削除処理中にプログラムが終わって変更後処理がうまく表示されません。どこが間違っているかが分からないしだいです。返答のほどよろしくお願いいたします。 #include<stdio.h> #include<malloc.h> #include<string.h> struct list{ char name[20]; int age; struct list *next; }; void main(void) { struct list *head, *p, *n, *old; char key[20]; /*ダミーノード作成*/ head = (struct list*)malloc(sizeof(struct list)); old = head; while(p = (struct list*)malloc(sizeof(struct list)), printf("name age入力\n"), scanf("%s %d", p -> name, &p -> age) != EOF){ old -> next = p; old = p; } free(p); old -> next = NULL; p = head -> next; printf("変更前リスト\n"); while(p != NULL){ printf("name:%s age:%d\n",p -> name, p -> age); p = p -> next; } printf("削除key入力(name)\n"); gets(key); n = head; while(n != NULL){ old = n; n = n -> next; //printf("n -> name %s\n", n -> name); if(strcmp(n -> name, key) == 0){ printf("%s削除\n", key); //printf("n -> name %s old -> name %s\n", n -> name, old -> name); old -> next = n -> next; } } p = head -> next; printf("変更後リスト\n"); while(p != NULL){ printf("name:%s age:%d\n", p -> name, p -> age); p = p -> next; } }

  • リスト構造のソートで悩んでます。。。

    リスト構造のソートで悩んでます。プログラムの内容はファイルからデータをリスト構造の構造体に読み込み、名前順にソートし結果を表示する。というものです。データの追加や削除はできるのですがソートとなると頭が混乱してしまいお手上げ状態になってしまいました。。。。。 読み込み用のデータとプログラムソースを以下に記載するのでどなたか良きアドバイスをお願いしますm(_ _)m ○データ Sakuragi 16 Rukawa 16 Miyagi 17 Akagi 18 Mitsui 18 ○ソース #include <stdio.h> #include <stdlib.h> #include <string.h> #define MENBER 5 typedef struct data{ char name[BUFSIZ]; int age; struct data *next; }LIST; LIST *newLIST(void); LIST *sort(LIST *); int main(int argc,char *argv[]){ FILE *fp; LIST *p; LIST *np; LIST *npb; LIST *head; char namae[BUFSIZ]; int toshi,i; if((fp=fopen(argv[1],"r"))==NULL){ printf("no file\n"); exit(1); } head = newLIST(); npb =head; for(i=0;i<MENBER;i++){ np = newLIST(); fscanf(fp,"%s %d",namae,&toshi); strcpy(np->name,namae); np->age = toshi; npb->next =np; npb = np; } sort(head); for(p=head->next;p != NULL;p=p->next){ printf("%s\t%d\n",p->name,p->age); } for(p=head->next;p != NULL;p=np){ np = p->next; free(p); } fclose(fp); return(0); } LIST *newLIST(){ LIST *p; p = (LIST *)malloc(sizeof(LIST)); p->next = NULL; return(p); } LIST *sort(LIST *head){ }

  • リスト構造がうまく動きません!!

    C言語で以下のようなプログラムを作りました。 「main関数内で下記のデ-タを構造体に格納し、キーボードから入力された名前と該当する学生の身長と年齢を画面に表示するプログラムを作成せよ。」というものです。 このプログラムはコンパイルは通るのですが、2人目以降のデータを表示させようとしても表示してくれません。。。どうもリスト構造のfor文がうまくループしていないみたいなんですが原因が分かりません。どなたか原因の分かる方アドバイスをお願いしますm(_ _)m #include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct data{ char name[20]; int height; int age; struct data *next; }person; person *newperson(void); int main(void){ char namae[20],s[20]; int toshi,shinchou,i; person *head; person *list; person *nlist; person *LIST; head = newperson(); nlist = head; printf("データを入れてください。\n"); for(i=0;i<=4;i++){ scanf("%s",namae); scanf("%d",&shinchou); scanf("%d",&toshi); list = newperson(); strcpy(list ->name,namae); list -> height = shinchou; list -> age = toshi; nlist -> next = list; nlist = list; } printf("知りたい人の名前は?\n"); scanf("%s",s); for(LIST = head->next;LIST ->next != NULL;LIST = LIST->next){ if(strcoll(s,LIST ->name)==0){ printf("%s\t%d\t%d\n",LIST->name,LIST->height,LIST->age); break; } printf("%s\n",LIST->name); printf("%s\n",LIST->next->name); } return(0); } person *newperson(){ person *dummy; dummy = (person*)malloc(sizeof(person)); dummy -> next = NULL; return(dummy); }

  • リンクリスト、deleteRecord() の書き方は?

    以下のような関数がありまして、 リストの真ん中と最後を削除することは できるのですが 先頭がうまくいきません。 また、先頭の場合は free() をどのように使うのでしょうか? code を見直してみると読み易くないような気もするんですが、 もっと効率の良い書き方ありますでしょうか? int deleteRecord(struct record **start, char name[]) {   int judge = 0;   struct record *temp, *temp2;   temp = *start;   if(debugmode == 1)     printf("deleteRecord called.\n");   if(temp != NULL) {     if(strcmp(temp->name, name) == 0) {       if(temp->next == NULL) { /* only start point */         temp = NULL;       }       else {         temp = temp->next;       }       judge = 1;     }     else if(temp->next != NULL) {       while(temp->next != NULL) {         if(strcmp(temp->next->name, name) == 0) {           if(temp->next->next != NULL) {             free(temp->next);             temp->next = temp->next->next;           }           else {             free(temp->next);             temp->next = NULL;           }           judge = 1;         }         if(temp->next != NULL)           temp = temp->next;       }     }   }   return judge; }

  • 線形リストのコードでどーしても理解できない個所があります。

    線形リストのコードでどーしても理解できない個所があります。 (以下、コード部分) typedef struct __node { char name[20]; char tel[16]; struct __node *next; } Node; typedef struct { Node *head; Node *tail; } List; Node *AllocNode(void) { return ((Node *)calloc(1, sizeof(Node))); } /*--- 新たに生成したノードを先頭へ挿入 ---*/ void InsertNode(List *list, const char *name, const char *tel) { Node *ptr = list->head; list->head = AllocNode(); strcpy(list->head->name, name); strcpy(list->haed->tel, tel); list->head->next = ptr; } /*--- pが指すノードの直前にノードを挿入 ---*/ void PutNodeP(List *list, Node *p, const char *name, const char *tel) { if (p == list->head) InsertNode(list, name, tel); else { Node *temp = AllocNode(); if (p == list->tail) list->tail = temp; else *temp = *p; strcpy(p->name, name); strcpy(p->tel, tel); temp->next = p; } } 上の29行目以降の≪pが指すノードの直前にノードを挿入≫についてです。 if文部分については理解できますが、else文部分について、何をやっているのかわからないです。Cの基本的な部分(ポインタも含めて)については充分に理解しているつもりです。 どなたか御教授頂けないでしょうか。 長々と書いてしまいましたがよろしくお願いします。

  • リスト構造を使ってSortとSearchをするプログラム

    タイトルのとおりのプログラムを組んでみました ----------himajin.c----------- #include <stdio.h> #include <string.h> #include <stdlib.h> // 参考:http://www9.plala.or.jp/sgwr-t/c/sec15-5.html // コンパイラ:BCC 5.5 // アイテムの加え方が違う。 struct Item { int data; /* データ */ struct Item *next; /* 次のデータへのポインタ */ }; struct Item *head; struct Item *tail; struct Item *addItem(struct Item *p,int newdata){ struct Item *t; t->data = newdata; t->next = tail; p->next = t; return t; } int main(){ struct Item *item; int inputdata; head = item; item->next = tail; while (scanf("%d", &inputdata) != EOF) { item = addItem(item,inputdata); } /* search(5); sort(); */ return 0; } int sort(){ struct Item *j; struct Item *p; struct Item *t; p = head; t = head; while (p->next != tail){ while (p->data > t->data){ j = t; t = t->next; } j->next = p; p->next = t; p = p->next; } } int search(int searchdata){ struct Item *t; t = head; tail->data = searchdata; while (searchdata != t->data){ t = t->next; } if(t == tail){ printf("Not Found"); } else{ printf("Found"); /*後で考える*/ } return 0; } ---- ...が、コマンドラインで himajin.exe 5 と入力してみたところ、いきなりプログラムが落ちました。何がいけないのでしょうか?

専門家に質問してみよう