###前提・実現したいこと
最近C言語でリスト構造を勉強したので自己流でリスト構造のプログラムを作成したのですが正常に作動しません。どなたか解決法を教えてください。
説明不足だったので補足します。
データの追加を行おうとすると動作が停止するのですがadd_data()の修正を試みたのですが、修正箇所が分かりません。
###該当のソースコード
C
1#define _CRT_SECURE_NO_WARNINGS 2#include <stdio.h> 3#include <stdlib.h> 4#include <string.h> 5 6/*データ*/ 7typedef struct { 8 int num; //学籍番号下三桁 9 char name[16]; //氏名 10}data_t; 11 12/*ノード*/ 13typedef struct node { 14 data_t data; //データ 15 struct node *nextnode; //後ろのノードへのポインタ 16}node_t; 17 18/*関数プロトタイプ宣言*/ 19node_t *make_node(data_t, node_t *); 20void add_data(node_t *); 21void remove_data(node_t *); 22void search_data(node_t *); 23void show_data(node_t *); 24void release(node_t *); 25 26int main(void) 27{ 28 int menu; 29 node_t *node=NULL; 30 31 do { 32 puts(""); 33 puts("***メニューの選択***"); 34 puts(" 1.データの追加"); 35 puts(" 2.データの削除"); 36 puts(" 3.データの検索"); 37 puts(" 4.データの表示"); 38 puts(" 5.終了"); 39 40 printf("メニューの選択:"); 41scanf("%d", &menu); 42 puts(""); 43 44 switch (menu) 45 { 46 case 1: add_data(node); break; 47 case 2: remove_data(node); break; 48 case 3: search_data(node); break; 49 case 4: show_data(node); break; 50 case 5: puts("プログラムを終了"); break; 51 default:puts("番号を再入力"); break; 52 } 53 } while (menu != 5); 54 55 release(node); 56 system("pause"); 57 return 0; 58} 59 60/*新規ノードの作成*/ 61node_t *make_node(data_t data, node_t *nextnode) 62{ 63 node_t *p; 64 65 p = malloc(sizeof(node_t)); 66 if (p == NULL) { 67 puts("領域確保に失敗"); 68 return NULL; 69 } 70 else { 71 p->data = data; 72 p->nextnode = nextnode; 73 return p; 74 } 75} 76 77/*データの追加*/ 78void add_data(node_t *node) 79{ 80 data_t data; 81 node_t *p=node; 82 83 puts("***追加するデータの入力***"); 84 printf("学籍番号の下二桁の番号:"); scanf("%d", &data.num); 85 printf("氏名:"); scanf("%s", data.name); 86 87 while (p->nextnode != NULL) { 88 p = p->nextnode; 89 } 90 p = make_node(data, NULL); 91} 92 93/*データの表示*/ 94void show_data(node_t *node) 95{ 96 node_t *p=node; 97 98 if (p ==NULL) { 99 puts("データがありません。データを追加してください。"); 100 return; 101 } 102 while (p!=NULL){ 103 printf("番号%*s氏名\n",6,""); 104 printf("%2d %10s\n", (p->data).num, (p->data).name); 105 p = p->nextnode; 106 } 107} 108 109/*データの削除*/ 110void remove_data(node_t *node) 111{ 112 int num; 113 node_t *pre; 114 if(node==NULL) 115 puts("データは見つかりませんでした。"); return; 116 puts("***データの削除***"); 117 printf("番号の入力:"); scanf("%d", &num); 118 119 while (node->nextnode != NULL) { 120 if ((node->data).num == num) { 121 pre = node->nextnode; 122 free(node); 123 return; 124 } 125 pre = node; 126 node = node->nextnode; 127 } 128 puts("データは見つかりませんでした。"); 129} 130 131/*データの検索*/ 132void search_data(node_t *node) 133{ 134 int num; 135 node_t *p=node; 136 137 puts("***データの検索***"); 138 printf("番号の入力:"); scanf("%d", &num); 139 140 if (node == NULL) 141 puts("データは見つかりませんでした"); return; 142 while (p->nextnode != NULL) { 143 if ((p->data).num == num) { 144 puts("---データを発見---"); 145 printf("氏名:%s\n", (p->data).name); 146 return; 147 } 148 p = p->nextnode; 149 } 150 puts("データは見つかりませんでした"); 151} 152 153/*データの後処理*/ 154void release(node_t *node) 155{ 156 node_t *p; 157 158 if (node = NULL) return; 159 while (node->nextnode != NULL) { 160 p = node; 161 node = node->nextnode; 162 free(p); 163 } 164}
回答4件
あなたの回答
tips
プレビュー