#include<stdio.h>
#include<stdlib.h>
#include<string.h>
 
struct address{
  //アドレス帳のデータ
  char name[40];
  char add[150];
  char number[12];
  char mail[80];
  
  struct address* next; //次の要素へのポインタ
};
 
/*プロトタイプ宣言*/
void data_show(struct address* head);
void data_add(struct address*head);
void data_del(struct address*head);
void data_sort(struct address*head);
int chooseMenu(void);

 
int main(void){
  struct address* head=NULL,*p;
  
  for(;;)
  
  {
  int choice;
  
  choice = chooseMenu();
  
  if(choice == 0) break;  
  
    scanf("%d",&choice);
    switch(choice){
    case 1: 
      data_add(head);
      break;
    case 2:
      data_del(head);
      break;
    case 3:
      data_sort(head);
      break;
    case 4: 
      data_show(head);
      break;
    case 5: 
      printf("終了します\n");
      break;
    default:
      printf("もう一度選択してください\n"); 
      break;
      
    }
  }
  return 0;
}
int chooseMenu(void)
{
	int num;
	
	printf("番号を選択してください\n");
	printf("【メニュー】1:追加 2:削除 3:種類 4:参照 5:終了\n");
	
	
	scanf("%d", &num);
	
	while( num < 1 || 5 < num )
	{
		printf("正しい番号を選んでください：");
		scanf("%d", &num);
	}
	
	return num;
	
}
 
//データの追加する関数
void data_add(struct address* head){
  struct address* p, *q, *new;
  char n_name[40];
  char n_add[150];
  char n_number[12];
  char n_mail[80];
 
  printf("追加する要素を入力してください\n");
  printf("名前："); scanf("%s",n_name);
  printf("住所："); scanf("%s",n_add);
  printf("電話番号："); scanf("%s",n_number);
  printf("メールアドレス："); scanf("%s",n_mail);
 
  p = head->next;
  q = head;
 
  while(p != NULL){
    q = p;
    p = p->next;
    
    
  }
 
  new = (struct address*)malloc(sizeof(struct address));
 
  strcpy(new->name,n_name);   
  strcpy(new->add,n_add); 
  strcpy(new->number,n_number);   
  strcpy(new->mail,n_mail);
  new->next = p;
  q->next = new;
  q = head;
  
}
 
 
void data_del(struct address* head){
  char name[40];
  struct address* p, *before;
   scanf("%s", &name);
  p = head;
  int flag = 0;
  while(p != NULL && strcmp(p->name,name)!=0){
    before = p;
    p = p->next;
    flag = 1;
    printf("a\n");
  }
  printf("%s\n",p->name);
  if(flag==0 && strcmp(p->name,name) == 0){
    before = p;
    p = p->next;
    before = NULL;
  }
 if(flag==0 && strcmp(p->name,name) == 0){
    head = p->next;
    free(p);
    
    printf("アドレスを削除しました\n\n");
    
  }else if(p == NULL){
    printf("アドレスに登録されていません\n\n");
    
    return ;
  }
  else{
    before->next = p->next;
    free(p);
    printf("アドレスを削除しました\n\n");
    
  }
}
  
  void data_show(struct address* head){
  struct address* p = head;
  while(p){
    printf("%s,%s,%s,%s\n",p->name,p->add,p->number,p->mail);
    p = p->next;
  }
  printf("\n");
}
 
//データソート関数
void data_sort(struct address* head){
  struct address* p,*before,*after;
  p = head;
  after = head->next;
 
  if(strcmp(p->name,after->name) > 0){
    p = after;
    p->next = head;
    p->next->next = after->next;
  }
 
  before = p;
  p = p->next;
  after = p->next;
  
  while(before){
    before = p;
    p = p->next;
    after = p->next;
      
  }
  printf("種類わけしました\n");
}

