#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct person {
char name[40];
int age;
struct person* next;
}Person;
void ls_addFirst(const char* nm, int ag);
void ls_add(Person* pos, const char* nm, int ag);
void ls_addLast(const char* nm, int ag);
void ls_removeFirst(void);
void ls_remove(Person* pos);
void ls_removeLast(void);
Person* ls_end(void);
Person* psn_malloc(const char* nm, int ag);
Person* ls_find(const char* ss);
void disp_all(void);
Person head;
int main(void) {
Person* p;
head.next = NULL;
printf("----------ls_addFirst,ls_addLAst\n");
ls_addFirst("山田次郎", 22);
ls_addFirst("山田一郎", 11);
ls_addLast("山田三郎", 33);
ls_addLast("山田四郎", 44);
disp_all();
printf("----------ls_find,ls_add\n");
p = ls_find("山田次郎");
if (p != NULL) ls_add(p, "追加五郎", 55);
disp_all();
printf("-----------ls_remove,ls_removeFirst,ls_removeLast\n");
p = ls_find("山田次郎");
if (p != NULL) ls_remove(p);
ls_removeFirst();
ls_removeLast();
disp_all();
return 0;
}
void ls_addFirst(const char* nm, int ag) {
ls_add(&head, nm, ag);
}
void ls_add(Person* pos, const char* nm, int ag) {
Person* dt;
if (pos == NULL) return;
dt = psn_malloc(nm, ag);
dt->next = pos->next;
pos->next = dt;
}
void ls_addLast(const char* nm, int ag) {
if (head.next == NULL) ls_addFirst(nm, ag);
else
ls_add(ls_end(), nm, ag);
}
void ls_removeFirst(void) {
ls_remove(&head);
}
void ls_remove(Person* pos) {
Person* tmp;
if (pos == NULL) return;
if (pos->next == NULL)return;
tmp = pos->next;
pos->next = pos->next->next;
free(tmp);
}
void ls_removeLast(void) {
Person* p;
if (head.next == NULL) return;
for (p = &head; p->next->next != NULL; p = p->next)
;
free(p->next);
p->next = NULL;
}
Person* ls_end(void) {
Person* p;
if (head.next == NULL) return NULL;
for (p = head.next; p->next != NULL; p = p->next)
;
return p;
}
Person* psn_malloc(const char* nm, int ag) {
Person* p;
if ((p = (Person*)malloc(sizeof(Person))) == NULL) {
printf("メモリを確保できません。\n"); exit(1);
}
strcpy_s(p->name, nm);
p->age = ag;
p->next = NULL;
return p;
}
Person* ls_find(const char* ss) {
Person* p;
for (p = head.next; p != NULL; p = p->next) {
if (strcpy_s(p->name, ss) == 0) return p;
}
return NULL;
}
void disp_all() {
Person* p;
for (p = head.next; p != NULL; p = p->next)
printf("%s: %d\n", p->name, p->age);
}
ネタ本との実行画面が合わないので、(二番目のブロック、途中に追加するところ)どっか間違っていると思われます。また、ネタ本ではchar *nmのようになってますが、VS2019ではconstを付けないとコンパイル通りません。それ以外は、今のところC++と違いなく、コンパイル出来ているようです。もう一つ、strcpyがエラーになって、strcpy_sを使うようにとのエラーのように思えました。constはイメージ的には分かりますが、strcpy_sは、違いが何処にあるんでしょうか?
間違っていたところが分かりました。ls_findが違ってました。strcpy_sでなくて、strcmpでした。