///////////////////////////////////////////////////////////
// //
// //
// メモリ消去用の実験テストプログラム //
// //
// //
// //
// 2014/06/29 //
///////////////////////////////////////////////////////////
#include <stdio.h>
#include <stdlib.h>
enum sex {woman, man};
typedef struct person {
enum sex sex; //性別
int age; //年齢
struct person *prev; /* 前の構造体を示すポインタ */
struct person *next; /* 次の構造体を示すポインタ */
} person;
int main ()
{
// 10人分のデータを作る
int i, k, count;
person *p_person, *p_prev_person, *p_next_person;
person *p_first_person, *p_last_person, *temp_p_person;
printf("checked 0.\n");
//////////// 現状データの入力 ////////////
p_person= (person *)malloc(sizeof(person));
if(p_person == NULL) {
printf("メモリが確保できません\n");
exit(EXIT_FAILURE);
}
p_person->sex = woman;
p_person->age = 10;
p_first_person = p_person; //最初の一人
// (最後に)ポインタをリンクする
p_person->prev = NULL;
p_prev_person = p_person;
for(i=9; i>=0; i--){
p_person= (person *)malloc(sizeof(person));
if(p_person == NULL) {
printf("メモリが確保できません %d\n",i);
exit(EXIT_FAILURE);
}
p_person->sex = woman;
p_person->age = i;
// (最後に)ポインタをリンクする
p_prev_person->next = p_person;
p_person->prev = p_prev_person;
p_person->next = NULL;
p_prev_person = p_person;
}
p_last_person = p_person; //最後の一人
printf("checked 1.\n");
//////////// 現状データの入力 終わり ////////////
//////////// データ削除の処理例 ////////////
p_person = p_first_person; //最初の一人
while (p_person != NULL){
if (p_person->age == 3){
// メモリを消す前の処理
if (p_person == p_first_person){ // 最初の場合
p_first_person = p_person->next;
p_first_person->prev = NULL;
free(p_person);
p_person = p_first_person;
printf("C1:");
}
else if (p_person == p_last_person){ //最後の場合
p_last_person = p_person->prev;
p_last_person->next = NULL;
free(p_person);
p_person = p_last_person;
printf("C2:");
}
else {
p_person->next->prev = p_person->prev;
p_person->prev->next = p_person->next;
temp_p_person = p_person->prev; // 一つ前のポインタに退避
free(p_person);
p_person = temp_p_person;
printf("C3:");
}
}
p_person = p_person->next;
}
//////////// 確認フェーズ ////////////
if (p_first_person == p_last_person){
printf("passed exit\n");
exit(0);
}
p_person = p_first_person;
while (p_person != NULL){
printf("%d ",p_person->age);
p_person = p_person->next;
}
}
#if 0
p_person = p_first_person;
while (p_person != NULL){
printf("%d ",p_person->age);
p_person = p_person->next;
}
p_person = p_last_person;
while (p_person != NULL){
printf("%d ",p_person->age);
p_person = p_person->prev;
}
#endif