前提・実現したいこと
C言語で自己参照構造体を作成しています。標準入力で入力したものをリストに追加していくのですが、新しく追加したものが構造体の先頭に来てしまいます。構造体の後ろに順に追加していく方法を教えてください。
該当のソースコード
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct TelephoneBook{
char name[16];
char number[16];
struct TelephoneBook *next;
};
struct TelephoneBook *add_book(char *name, char *number,struct TelephoneBook *head);
void print_book(struct TelephoneBook *p);
void free_book(struct TelephoneBook *p);
int check_name(char *na);
int check_number(char *num);
int main(void){
struct TelephoneBook *head;
char name_number[33];
char name[16]; //入力した名前を格納する
char number[16]; //入力した電話番号を格納する
int check_na; //仕様通りに入力されてなければ1,\qが入力されていれば2が代入される
int check_nu; //仕様通りに入力されてなければ1が代入される
head = NULL;
while(1){ printf("input>"); fgets(name_number,33,stdin); sscanf(name_number,"%s %s", name, number); check_na = check_name(name); if(check_na == 2){ print_book(head); free_book(head); return EXIT_SUCCESS; } if (check_na == 1){ printf("error"); return EXIT_FAILURE; } check_nu = check_number(number); if (check_nu == 1){ printf("error"); return EXIT_FAILURE; } if(check_na == 0 && check_nu == 0){ printf("Ok\n"); } head = add_book(name,number,head); }
}
int check_name(char *na){
char name[16] = " ";
strcpy(name, na);
char *chr1 = "\q";
char *chr2 = "\Q";
if(strcmp(name,chr1) == 0 || strcmp(name,chr2) == 0){
return 2;
}
int len = strlen(name);
if(name[0] >= 'A' && name[0] <= 'Z'){
}else{ return 1; } for(int i = 1; i <= len; i++){ if(name[i] >= 'a' || name[i] <= 'z'){ }else{ return 1; } } return 0;
}
int check_number(char *num){
char number[16];
strcpy(number, num);
for(int i = 0; i <= 2; i++){
if(number[i] >= '0' && number[i] <= '9'){
}else{ return 1; } } for(int i = 4; i <= 7; i++){ if(number[i] >= '0' && number[i] <= '9'){ }else{ return 1; } } for(int i = 9; i <= 12; i++){ if(number[i] >= '0' && number[i] <= '9'){ }else{ return 1; } } if(number[3] != '-' || number[8] != '-'){ return 1; } return 0;
}
struct TelephoneBook *add_book(char *name, char *number,struct TelephoneBook *head){
struct TelephoneBook *p = head;
while ( p->next != NULL ) {
p = p->next;
}
p = (struct TelephoneBook *) malloc(sizeof(struct TelephoneBook));
strcpy(p->name, name);
strcpy(p->number, number);
p->next = head;
head = p;
return head;
}
void print_book(struct TelephoneBook *p){
while (p != NULL) {
printf("%s : %s\n", p->name, p->number);
p = p->next;
}
}
void free_book(struct TelephoneBook *p){
struct TelephoneBook p2;
while (p != NULL) { / 次ポインタがNULLまで処理 */
p2 = p->next;
free(p);
p = p2;
}
}
試したこと
p->next = head; head = p;
の前にfor文で構造体の最後を探してみようとしてみましたが上手くいきませんでした。
。
回答2件
あなたの回答
tips
プレビュー