これ以上は限界と感じたため再び皆様にお力をお貸しいただければと思い書き込ませていただきました。
名前を連結リストに追加、削除、そしてリストの中身の表示、反転を行うプログラムを作っております。
出来ない点は
・数値しか入出力ができない。名前なので文字列を扱えるようにしたい。
(文字列ができるように''やchar、%sなど試みていましたがエラーがあまりにも多く、数値だけ認識できる状態のコードを書き込ませていただきます)
・名前と苗字を両方入力したい。
(そのためには判定も増やさなくてはならず出力した場合も名前の間に半角スペースが必要であり、どのように書き込めばいいかあまりにも難しく理解することができなかった)
コードを書き込ませていただきます。
本当にプログラミングの右も左もわからない初心者ですが、何卒ご指摘助言よろしくお願いいたします。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//構造体の宣言
typedef struct list{
int data;
struct list *next;
} LIST;
//headはリストの先頭 tailはリストの末尾
LIST *head,*tail;
//指定の数字が存在するかのフラグ
int non=0;
//リストの中身の表示
void display_list(LIST *p) {
if(p == NULL)
printf("リストには何もありません\n");
else{
printf("現在のリストの中身は\n");
printf("%d", p->data);
p = p->next;
while(p != NULL){
printf(",%d", p->data);
p = p->next;
}
printf("\nです\n");
}
}
//リストの作成
LIST *new_list(int x, LIST *y){
LIST *c = (LIST *)malloc(sizeof(LIST));
c->data = x;
c->next = y;
return c;
}
//リストに名前を追加
void add_list(int x){
LIST *p;
p = new_list(x, NULL);
if(head == NULL)
head = tail = p;
else{
tail->next = p;
tail = p;
}
}
//リストから名前を削除
void delete_list(int x){
LIST *p, *q;
q = p = head;
while(p != NULL && x != p->data){
q = p;
p = p->next;
}
//見つからなかった場合
if (p == NULL){
non=1;
return;
}
//先頭にあった場合
if (q == p) head = head->next;
//それ以外 消えた部分を連結
else q->next = p->next;
free(p);
}
//リストの中身を反転
LIST *reverse(LIST *list){
LIST *p;
if(list==NULL) return list;
p=new_list(list->data,NULL);
tail=p;
while(list->next!=NULL){
list=list->next;
p=new_list(list->data,p);
}
return p;
}
int main(){
int a,add,del;
head=NULL;
tail=NULL;
while(1){
printf(" コマンド表 \n");
printf("0 : リストの表示 1 : リストの追加\n");
printf("2 : リストの削除 3 : リストの反転\n");
printf(" 4 : 処理の終了 \n");
printf("コマンドを入力してください:");
scanf("%d",&a);
//リストの表示
if(a==0){
display_list(head);
//リストの追加
}else if(a==1){
printf("追加する名前は?(最大40字)\n");
scanf("%d",&add);
add_list(add);
printf("%d を追加しました!\n",add);
//リストの削除
}else if(a==2){
printf("削除する名前は?\n");
scanf("%d",&del);
delete_list(del);
if(non==0){
printf("%d を削除しました!\n",del);
}else if(non==1){
printf("その名前はリストに存在しません!\n");
non=0;
}
//リストの反転
}else if(a==3){
head=reverse(head);
printf("反転が完了しました\n");
//処理の終了
}else if(a==4){
printf("終了します\n");
break;
}
}
return(0);
}