/*広告*/

/*[C言語]サンプルプログラム集 疑似単方向リストソース*/

/*目次へ戻る*/

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_LIST 20 #define MY_NULL -1 struct LIST{ char name[128]; char num[128]; int next; int flag; }; struct LIST list[MAX_LIST]; void init(void); void add_head(char *,char *); void add_tail(char *,char *); void del_head(void); void del_tail(void); void disp_list(void); void disp_memory(void); void disp_relationship(void); void free_list(void); int my_malloc(void); void my_free(int ); int head,tail; int main(){ char input_name[128]; char input_num[128]; int num; int i; int flag = 1; init(); while(flag){ printf("使用中のメモリ(使用中:1 未使用:0)\n"); disp_memory(); printf("\n"); disp_relationship(); printf("\n"); printf("どうしますか?\n"); printf("1)先頭に登録 2)末尾に登録 3)先頭を削除 4)末尾を削除\n"); printf("5)表示 6)画面消去 7)終了 > "); scanf("%d",&num); switch(num - 1){ case 0: printf("名前を登録してください > "); scanf("%s",input_name); printf("電話番号を登録してください > "); scanf("%s",input_num); add_head(input_name,input_num); printf("\n"); disp_list(); printf("\n"); break; case 1: printf("名前を登録してください > "); scanf("%s",input_name); printf("電話番号を登録してください > "); scanf("%s",input_num); add_tail(input_name,input_num); printf("\n"); disp_list(); printf("\n"); break; case 2: del_head(); disp_list(); printf("\n"); break; case 3: del_tail(); disp_list(); printf("\n"); break; case 4: disp_list(); printf("\n"); break; case 5: system("cls"); break; case 6: flag = 0; break; default: break; } } printf("終了しました!\n\n"); free_list(); printf("最終メモリチェック\n"); disp_memory(); disp_relationship(); printf("\n"); return 0; } void init(){ head = MY_NULL; tail = MY_NULL; } void add_head(char *input_name,char *input_num){ int p; if(head != MY_NULL){ p = my_malloc(); strcpy(list[p].name,input_name); strcpy(list[p].num,input_num); list[p].next = head; head = p; } else{ add_tail(input_name,input_num); } } void add_tail(char *input_name,char *input_num){ int p; p = my_malloc(); if(tail == MY_NULL){ head = p; } else{ list[tail].next = p; } tail = p; strcpy(list[tail].name,input_name); strcpy(list[tail].num,input_num); list[tail].next = MY_NULL; } void del_head(){ int p; if(head != MY_NULL){ p = list[head].next; my_free(head); head = p; if(head == MY_NULL){ tail = MY_NULL; } } } void del_tail(){ int p; if(tail != MY_NULL){ p = head; while(p != MY_NULL){ if(list[p].next == tail){ list[p].next = MY_NULL; break; } p = list[p].next; } my_free(tail); tail = p; if(tail == MY_NULL){ head = MY_NULL; } } } void disp_list(){ int p; int n = 0; p = head; printf("\n名前 電話番号\n"); while(p != MY_NULL){ printf("%d:%s %s\n",n + 1,list[p].name,list[p].num); n++; p = list[p].next; } } void disp_memory(){ int i; for(i=0;i<MAX_LIST;i++){ printf("[%d]",list[i].flag); } } void disp_relationship(){ int p; p = head; while(p != MY_NULL){ printf("→%d",p); p = list[p].next; } } void free_list(){ int p; int p2; p = head; while(p != MY_NULL){ p2 = list[p].next; my_free(p); p = p2; } head = MY_NULL; tail = MY_NULL; } int my_malloc(){ int i; for(i=0;i<MAX_LIST;i++){ if(list[i].flag == 0){ list[i].flag = 1; break; } } return i; } void my_free(int num){ list[num].flag = 0; }

/*ページの先頭へ*/

/*目次へ戻る*/

/*HOME*/

/*Copyright 2016 K.N/petitetech.com*/

/*広告*/