#include #include typedef struct list { int value; struct list *nextPtr; } LIST; LIST *insert_list(LIST *list, int data); LIST *delete_list(LIST *list, int data); void print_list(LIST *list); void print_num(LIST *list); int isEmpty(LIST *list); void usage(void) { printf("使い方: 1: リストにある数を追加\n"); printf(" 2: リストからある数を削除\n"); printf(" 3: リストの印刷\n"); printf(" 4: リストの要素の数を数える\n"); printf(" 5: 終了\n"); } int main(void) { LIST *start = NULL; int data; int menu; usage(); printf("メニュー番号を入力してください:"); scanf("%d", &menu); while(menu != 5) { switch(menu) { case 1: printf("リストに挿入する数を入力してください:"); scanf("%d", &data); start = insert_list(start, data); break; case 2: if ( isEmpty(start) ){ printf("リストは空です\n"); } else { printf("削除する数を入力してください:"); scanf("%d", &data); start = delete_list(start, data); } break; case 3: print_list(start); break; case 4: print_num(start); break; default: printf("番号が不正です\n"); usage(); break; } printf("メニュー番号を入力してください:"); scanf("%d", &menu); } return 0; } int isEmpty(LIST *list) { return list == NULL; } LIST *insert_list(LIST *listPtr, int data) { LIST *newPtr, *previousPtr, *currentPtr; newPtr = (LIST *)malloc(sizeof(LIST)); if ( newPtr == NULL ) { printf("メモリ不足でデータが割り当てられません\n"); } else { newPtr->value = data; newPtr->nextPtr = NULL; previousPtr = NULL; currentPtr = listPtr; while ( currentPtr != NULL && data > currentPtr->value ) { previousPtr = currentPtr; currentPtr = currentPtr->nextPtr; } if ( previousPtr == NULL ) { newPtr->nextPtr = listPtr; listPtr = newPtr; } else { previousPtr->nextPtr = newPtr; newPtr->nextPtr = currentPtr; } } return listPtr; } LIST *delete_list(LIST *listPtr, int data) { LIST *previous, *current, *tmp; if ( data == listPtr->value ) { tmp = listPtr; listPtr = listPtr->nextPtr; free(tmp); } else { previous = listPtr; current = listPtr->nextPtr; while ( current != NULL && current->value != data ) { previous = current; current = current->nextPtr; } if ( current != NULL ) { tmp = current; previous->nextPtr = current->nextPtr; free(tmp); } } return listPtr; } void print_list(LIST *listPtr) { if (listPtr == NULL) { printf("リストは空です\n"); } else { printf("リストの内容\n"); while ( listPtr != NULL) { printf("%d ->", listPtr->value); listPtr = listPtr->nextPtr; } printf("NULL\n\n"); } } void print_num(LIST *listPtr) { int n = 0; while ( listPtr != NULL) { n++; listPtr = listPtr->nextPtr; } printf("要素の数は %d 個です\n", n); }