双方向リスト

双方向リストの基本形


構造体の基本形
typedef struct p_tag{	/* タグ */
char name[20]; /* 名前 */
int age ; /* 年齢 */
struct p_tag *prev; /* 前のデータへのポインタ */
struct p_tag *next; /* 次のデータへのポインタ */
} personal_t; /* 住所データ型の定義 *

追加の基本形
双方向リストでの末尾への追加
0
pNew = makeNewNode("B-san", 24) ;
1
pNow->next = pNew ;
2
pNew->prev = pNow ;


削除の基本形
双方向リストでの削除
0

1
pNow->prev->next = pNow->next ;
2
pNow->next->prev = pNow->prev ;
3
releaseNode(pNow) ;


挿入の基本形


0
pNew = makeNewNode("B-san", 24) ;
0
pNew->next = pNow->next ;
0

0

0

5



演習
 「挿入の基本形」をもとに,次のプログラムを完成させなさい.
#include <stdio.h>
#include <stdlib.h>
#define SIZE 40

char *FILE_NAME = "address.txt";

// 構造体定義
typedef struct p_tag{ /* タグ */
char name[SIZE]; /* 名前 */
int age ; /* 年齢 */
struct p_tag *prev; /* 前のデータへのポインタ */
struct p_tag *next; /* 次のへのポインタ */
} personal_t; /* 住所データ型の定義 */


/* 新データの作成関数 */
personal_t* makeNewNode(char *aName, int aAge) {
personal_t *pNewData;

/*** personal_t 型のメモリ領域確保 ***/
pNewData = (personal_t *) malloc (sizeof(personal_t)) ;

/*** データ設定 ***/
strcpy(pNewData->name, aName);
pNewData->age = aAge ;
pNewData->prev = NULL ;
pNewData->next = NULL ;

return pNewData ;
} ;


/* データ追加関数 */
/*  pNow の後ろに pNew を追加する */
void addNewNode(personal_t *pNow, personal_t *pNew) {
pNow->next = pNew ;
pNew->prev = pNow ;
} ;


/* main関数 */
int main(void){
/* ポインタ変数として先頭を定義 */
personal_t *pTop = NULL ;
/* 新データ作成用と現在位置用ポインタ */
personal_t *pNew, *pNow ;

/* A-san のデータを作成 */
pNew = makeNewNode("A-san", 20) ;
pTop = pNew ;
pNow = pTop ; /* 現在位置を記憶 */

/* B-san のデータを追加 */
pNew = makeNewNode("B-san", 24) ;
addNewNode(pNow, pNew) ;
pNow = pNew ; /* 現在位置を更新 */

/* C-san のデータを A-san と B-さんの間に挿入 */
pNow = pTop ; /* pNow を A-san の位置にする */
pNew = makeNewNode("C-san", 28) ; /* C-san のデータを作成 */
/* ここで,挿入処理 */

/* リストの全データを確認 */
pNow = pTop ;
while (pNow != NULL) {
printf("%15s : %3d\n", pNow->name, pNow->age) ;
pNow = pNow->next ;
} ;

exit(0);
} ;


単方向解答
双方向テンプレート