カテゴリー
C

C言語による実用アルゴリズム入門、リスト処理の写経

#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でした。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

inserted by FC2 system