C言語関係掲示板

過去ログ

No.1059 リストから同一データの削除

[戻る] [ホームページ]
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つは、どちらも同じ意味かと…