質問編集履歴

1 ソースコードのインデントの修正と「前提・実現したいこと」の補足をしました。

maikeru

maikeru score 63

2017/10/15 18:45  投稿

c言語 リスト構造について...
###前提・実現したいこと
最近C言語でリスト構造を勉強したので自己流でリスト構造のプログラムを作成したのですが正常に作動しません。どなたか解決法を教えてください。
説明不足だったので補足します。  
データの追加を行おうとすると動作が停止するのですがadd_data()の修正を試みたのですが、修正箇所が分かりません。  
 
###該当のソースコード  
###該当のソースコード  
C  
```C
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
/#include <string.h>
#include <string.h>
/*データ*/
typedef struct {
   int num;           //学籍番号下三桁
   char name[16];       //氏名
}data_t;
/*ノード*/
typedef struct node {
   data_t data;          //データ
   struct node *nextnode;   //後ろのノードへのポインタ
   data_t data;             //データ
   struct node *nextnode;    //後ろのノードへのポインタ
}node_t;
/*関数プロトタイプ宣言*/
node_t *make_node(data_t, node_t *);
void add_data(node_t *);
void remove_data(node_t *);
void search_data(node_t *);
void show_data(node_t *);
void release(node_t *);
int main(void)
{
   int menu;
   node_t *node=NULL;
   do {
       puts("");
       puts("***メニューの選択***");
       puts(" 1.データの追加");
       puts(" 2.データの削除");
       puts(" 3.データの検索");
       puts(" 4.データの表示");
       puts(" 5.終了");
       printf("メニューの選択:");   scanf("%d", &menu);
       printf("メニューの選択:");   
scanf("%d", &menu);
       puts("");
       switch (menu)
       {
           case 1: add_data(node);                 break;
           case 2: remove_data(node);              break;
           case 3: search_data(node);              break;
           case 4: show_data(node);              break;
           case 5: puts("プログラムを終了");   break;
           case 1: add_data(node);         break;
           case 2: remove_data(node);        break;
           case 3: search_data(node);        break;
           case 4: show_data(node);         break;
           case 5: puts("プログラムを終了");    break;
           default:puts("番号を再入力");       break;
       }
   } while (menu != 5);
   release(node);
   system("pause");
   return 0;
}
/*新規ノードの作成*/
node_t *make_node(data_t data, node_t *nextnode)
{
   node_t *p;
   p = malloc(sizeof(node_t));
   if (p == NULL) {
       puts("領域確保に失敗");
       return NULL;
   }
   else {
       p->data = data;
       p->nextnode = nextnode;
       return p;
   }
}
/*データの追加*/
void add_data(node_t *node)
{
   data_t data;
   node_t *p=node;
   puts("***追加するデータの入力***");
   printf("学籍番号の下二桁の番号:");   scanf("%d", &data.num);
   printf("氏名:");                   scanf("%s", data.name);
   while (p->nextnode != NULL) {
       p = p->nextnode;
   }
   p = make_node(data, NULL);
}
/*データの表示*/
void show_data(node_t *node)
{
   node_t *p=node;
   if (p ==NULL) {
       puts("データがありません。データを追加してください。");
       return;
   }
   while (p!=NULL){
       printf("番号%*s氏名\n",6,"");
       printf("%2d %10s\n", (p->data).num, (p->data).name);
       p = p->nextnode;
   }
}
/*データの削除*/
void remove_data(node_t *node)
{
   int num;
   node_t *pre;
   if(node==NULL)
       puts("データは見つかりませんでした。"); return;
   puts("***データの削除***");
   printf("番号の入力:");   scanf("%d", &num);
   while (node->nextnode != NULL) {
       if ((node->data).num == num) {
           pre = node->nextnode;
           free(node);
           return;
       }
       pre = node;
       node = node->nextnode;       
   }
   puts("データは見つかりませんでした。");
}
/*データの検索*/
void search_data(node_t *node)
{
   int num;
   node_t *p=node;
   puts("***データの検索***");
   printf("番号の入力:");   scanf("%d", &num);
   if (node == NULL)   
       puts("データは見つかりませんでした"); return;
   while (p->nextnode != NULL) {
       if ((p->data).num == num) {
           puts("---データを発見---");
           printf("氏名:%s\n", (p->data).name);
           return;
       }
       p = p->nextnode;
   }
   puts("データは見つかりませんでした");
}
/*データの後処理*/
void release(node_t *node)
{
   node_t *p;
   if (node = NULL) return;
   while (node->nextnode != NULL) {
       p = node;
       node = node->nextnode;
       free(p);
   }
}
}
```
```
```
  • C

    8717 questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る