【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は謹んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.19650

双方向リスト
投稿者---ラマハヤシキア(2005/01/30 17:15:11)


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

typedef struct list {
int key; /* キー */
char name[20]; /* 名前 */
struct list *next; /* 次のデータへのポインタ */
} list_t;

list_t *add_list(int key, char *name, list_t *head);
void show_list(list_t *p);
void free_list(list_t *p);

int main()
{
struct list *head; /* 先頭ポインタ */
char name[20];
char lines[80];
int key = 0, i = 0;

head = NULL; /* 先頭ポインタにNULLを設定 */

printf("キーと名前(MAX:19文字)を入力(終了:データを4つ入力したら)n");
while (i < 4) {
fgets(lines, 80, stdin);
sscanf(lines, "%d %s", &key, name);
/* リストにデータを登録 */
head = add_list(key, name, head);
i++;
}
/* リストの表示 */
show_list(head);

/* リストの開放 */
free_list(head);

return 0;
}

list_t *add_list(int key, char *name, list_t *head)
{
list_t *p, *new_p;

/* 記憶領域の確保 */
new_p = (list_t *)malloc(sizeof(list_t));

/* リストにデータを登録 */
new_p->key = key;
strcpy(new_p->name, name);

if (head == NULL || key > head->key) {
/* ポインタのつなぎ換え */
new_p->next = head;
return new_p;
}

/* キーのサーチ */
for ( p = head; p->next != NULL; p = p->next )
if ( key > p->next->key ) break;
/* ポインタのつなぎ換え */
new_p->next = p->next;
p->next = new_p;

return head;
}

void show_list(list_t *p)
{
while (p != NULL) { /* 次ポインタがNULLまで処理 */
printf("%3d %sn", p->key, p->name);
p = p->next;
}
}

/*** リストの開放 ***/
void free_list(list_t *p)
{
list_t *p2;

while (p != NULL) { /* 次ポインタがNULLまで処理 */
p2 = p->next;
free(p);
p = p2;
}
}
上のプログラムを双方向リストを用い、追加、挿入、削除できるようにしたらどうなりますか?


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:双方向リスト 19652 Blue 2005/01/30 17:50:59


No.19652

Re:双方向リスト
投稿者---Blue(2005/01/30 17:50:59)


構造体にNextポインタみたいにPrevポインタを追加して、それ相応の
処理をすれば出来るはずだが。
このソースがかけるなら楽ちんだと思うのだが。

typedef struct list
{
    int          key;      /* キー */
    char         name[20]; /* 名前 */
    struct list* next;     /* 次のデータへのポインタ */
    struct list* prev;     /* 前のデータへのポインタ */
} list_t;

>printf("キーと名前(MAX:19文字)を入力(終了:データを4つ入力したら)n");
>printf("%3d %sn", p->key, p->name);
nじゃなくて\nじゃないかと。。。


# ※ソースの添付は「HTML変換ツール」で字下げ!
# ※環境(OSとコンパイラ)や症状は具体的に詳しく!



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧