No.13771![]() |
リストの削除 投稿者---すぬーぴー(2004/04/26 15:59:40) |
||
struct list{ char *key[20]; char *name[20]; struct list *next; }; 上のような構造体にデータが入っているんですが、 全く同じデータが複数存在した場合に、1つにしたいのですが、 リストのポインタの受け渡し方がよくわかりません。 どなたかご教授お願いいたします。 |
No.13776![]() |
Re:リストの削除 投稿者---RAPT(2004/04/26 17:43:46) |
||
環境も仕様も記載がないので概要だけ。 ※「リスト」「ノード」「削除」で検索すると幸せになれると思います。 1.削除予定のリストのインデックスを取得 2.該当リストとその前後のポインタを取得 3.該当ノードを削除 4.前後のノードを繋ぎ替え |
No.13779![]() |
Re:リストの削除 投稿者---かずま(2004/04/26 21:55:46) |
||
> struct list{ > char *key[20]; > char *name[20]; > struct list *next; > }; key や name がポインタの配列というのはおかしくないですか? key や name を次のプログラムのように配列にしてよろしいでしょうか? また、次のプログラムには何が足りないと思いますか? #include <stdio.h> #include <stdlib.h> #include <string.h> struct list { char key[20]; char name[20]; struct list *next; }; struct list *uniq(struct list *head) { struct list *p1, *p2, *p; if (head == NULL) return NULL; for (p1 = head, p2 = p1->next; p2 != NULL; ) { for (p = head; p != p2; p = p->next) if (!strcmp(p->key, p2->key) && !strcmp(p->name, p2->name)) break; if (p == p2) p1 = p2, p2 = p2->next; else p = p2, p1->next = p2 = p2->next, free(p); } return head; } void print(const struct list *p) { for (; p; p = p->next) printf("%-5s %s\n", p->key, p->name); } struct list *add(struct list *head, const char *key, const char *name) { struct list *p = malloc(sizeof(*p)); strcpy(p->key, key); strcpy(p->name, name); p->next = head; return p; } int main(void) { struct list *head = NULL; head = add(head, "13", "King"); head = add(head, "13", "King"); head = add(head, "11", "Jack"); head = add(head, "12", "Queen"); head = add(head, "11", "Jack"); print(head); head = uniq(head); puts("---"); print(head); return 0; } |
No.13793![]() |
Re:リストの削除 投稿者---すぬーぴー(2004/04/27 18:51:45) |
||
確かに間違ってました。 正しくはかずまさんの通りです。 プログラムに足りない部分は for (; p; p = p->next) printf("%-5s %s\n", p->key, p->name); の部分が for (; p != NULL ; p = p->next) printf("%-5s %s\n", p->key, p->name); ですよね。 おかげで解決することが出来ました。 ありがとうございました。 |
No.13798![]() |
Re:リストの削除 投稿者---とおりすがり(2004/04/28 02:12:26) |
||
その2つは、どちらも同じ意味かと… |