C言語関係掲示板

過去ログ

No889 リスト構造で構造体の最後にデータを追加したい

[戻る] [ホームページ]
No.384

リスト構造で構造体の最後にデータを追加したい
投稿者---MAI(2003/08/07 17:44:43)


下記プログラムにデータを追加する関数をつくりたいのですが、
うまくできません。

別関数で一番最後のデータの後ろに追加するやり方を教えてください。


#include <stdio.h>
#include <malloc.h>
#include <string.h>

#define DATA_MAX 10 /* データ量 */

int Counter;

/* データの構造体宣言 */
struct DataTag{
char *Data; /* データ格納用 */
struct DataTag *Previous; /* 前のデータへのポインタ */
struct DataTag *Next; /* 次のデータへのポインタ */
};

/* 双方向リスト構造格納用ルーチン */
void MultiList(struct DataTag *root,struct DataTag *last);

void main(void)
{
/* 始めと最後のアドレス保持用 */
/* 最後のアドレスはwkをNULLまで行かすと戻れ無くなるため。
wk->Next!=NULLとすれば必要は無くなる。 */
struct DataTag root,last;

/* 表示用 */
struct DataTag *wk;

/* 最初と最後のリスト構造のアドレスを渡す */
MultiList(&root,&last);

/* 結果表示 */
/* 通常のリスト構造 */
wk = &root;
while(wk != NULL){
printf("%s\n",wk->Data);
wk = wk->Next;
}
/* 双方向の為に逆から表示 */
/* wk = &last;
while(wk != NULL){
printf("%s\n",wk->Data);
wk = wk->Previous;
}
*/

/* 双方向の為に逆から表示 */
wk = &last;
while(wk != NULL){
printf("::%s ",wk->Data);
wk = wk->Previous;
}
printf("\n");

}

void MultiList(struct DataTag *root,struct DataTag *last)
{
struct DataTag *move,*wk;
Counter = 1;

wk = move = root;
wk->Data = (char *)malloc(50);
strcpy( wk->Data, "AAA");
printf ("Data = %s\n", wk->Data);
//wk->Data = Counter;

/* 前のポインタをNULLに */
wk->Previous = NULL;
wk->Next = NULL;

while(Counter < DATA_MAX-1){
/* メモリの確保 */
wk = (struct DataTag *)malloc(sizeof(struct DataTag));

/* データを変化 */
Counter++;

/* データの格納 */
//wk->Data = Counter;
wk->Data = (char *)malloc(50);
strcpy( wk->Data, "BBB");
printf ("Data = %s\n", wk->Data);

/* 前のアドレスを取得 */
wk->Previous = move;
wk->Next = NULL;

/* リストに繋げる */
move->Next = wk;

/* ポインタの移動 */
move = move->Next;
}

/* 最後のデータをlastに格納 */
*last = *move;
}


No.387

Re:リスト構造で構造体の最後にデータを追加したい
投稿者---かずま(2003/08/07 22:49:46)


> 下記プログラムにデータを追加する関数をつくりたいのですが、
> うまくできません。

【掲示板ご利用上の注意】をよく読んで、ソースの添付を
うまくやってください。

次のプログラムは参考になりますか?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct Node {
    char *data;
    struct Node *prev, *next;
} Node;

void init(Node *p) { p->prev = p->next = p; }

void print(Node *lp)
{
    Node *p = lp;

    while ((p = p->next) != lp) printf("%s ", p->data);
    printf("\n");
}

void add_tail(Node *lp, const char *data)
{
    Node *p = malloc(sizeof(Node));
    p->data = strdup(data);
    p->prev = lp->prev;  p->next = lp;
    lp->prev->next = p;  lp->prev = p;
}

void add_head(Node *lp, const char *data)
{
    Node *p = malloc(sizeof(Node));
    p->data = strdup(data);
    p->prev = lp;  p->next = lp->next;
    lp->next->prev = p;  lp->next = p;
}

int main(void)
{
    Node list;

    init(&list);
    add_tail(&list, "333");   /* 333                 */
    add_tail(&list, "444");   /* 333 444             */
    add_tail(&list, "555");   /* 333 444 555         */
    add_head(&list, "222");   /* 222 333 444 555     */
    add_head(&list, "111");   /* 111 222 333 444 555 */
    print(&list);
    return 0;
}