home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DOS/V Power Report 2000 December
/
VPR0012A.BIN
/
OLS
/
CMKT111
/
cmkt111.lzh
/
Cmachine
/
sample
/
record.c
< prev
next >
Wrap
C/C++ Source or Header
|
2000-09-10
|
2KB
|
123 lines
/*
* C machine サンプル ~ 構造体・ヒープ領域
*
* 「連結リスト」
*
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
/*
* 1レコード構造体
*/
typedef struct one_rec{
char name[20]; // 氏名
unsigned short age; // 年齢
struct one_rec *next; // 次
} ONE_REC;
ONE_REC *top_rec; // レコードリストトップポインタ
void AddRec(void); // リストにレコードを追加
void DelRec(void); // リストから氏名指定によりレコードを削除
void OutList(void); // リスト一括出力
void FreeList(void); // リスト一括開放
int main(void)
{
short no, loop_flg = 1;
while(loop_flg) {
puts("1:追加、2:削除、3:出力、4:終了");
printf("1~4のどれかを入力してください:");
scanf("%hd", &no);
switch(no)
{
case 1: // 追加
AddRec();
break;
case 2: // 削除
DelRec();
break;
case 3: // 出力
OutList();
break;
case 4: // 終了
default:
FreeList();
loop_flg = 0;
}
}
return 0;
}
void AddRec(void)
{
ONE_REC **rec_wk;
rec_wk = &top_rec;
while(*rec_wk != NULL) {
rec_wk = &(*rec_wk)->next;
}
*rec_wk = (ONE_REC *)malloc(sizeof(ONE_REC));
memset(*rec_wk, 0, sizeof(ONE_REC));
printf("氏名:"); scanf("%s", (*rec_wk)->name);
printf("年齢:"); scanf("%hd", &(*rec_wk)->age);
}
void DelRec(void)
{
ONE_REC *rec_wk = top_rec;
ONE_REC *rec_prev = NULL;
char name_wk[20];
printf("削除するレコードの氏名:"); scanf("%s", name_wk);
while(rec_wk != NULL) {
if(strcmp(name_wk, rec_wk->name) == 0) {
if(rec_prev != NULL) {
rec_prev->next = rec_wk->next;
}
else {
top_rec = rec_wk->next;
}
free(rec_wk);
break;
}
rec_prev = rec_wk;
rec_wk = rec_wk->next;
}
}
void OutList(void)
{
ONE_REC *rec_wk = top_rec;
while(rec_wk) {
printf("名前:%s 年齢:%d\n", rec_wk->name, rec_wk->age);
rec_wk = rec_wk->next;
}
}
void FreeList(void)
{
ONE_REC *rec_wk = top_rec;
ONE_REC *rec_next;
while(rec_wk) {
rec_next = rec_wk->next;
free(rec_wk);
rec_wk = rec_next;
}
top_rec = NULL;
}