文字列とメモリ割り当てについて:
C の文字列は単なる一連のchar
s であるため、文字列データ型を使用する場合はどこでもchar *
または配列を使用できます。char
typedef struct {
int number;
char *name;
char *address;
char *birthdate;
char gender;
} patient;
次に、構造体自体と各文字列にメモリを割り当てる必要があります。
patient *createPatient(int number, char *name,
char *addr, char *bd, char sex) {
// Allocate memory for the pointers themselves and other elements
// in the struct.
patient *p = malloc(sizeof(struct patient));
p->number = number; // Scalars (int, char, etc) can simply be copied
// Must allocate memory for contents of pointers. Here, strdup()
// creates a new copy of name. Another option:
// p->name = malloc(strlen(name)+1);
// strcpy(p->name, name);
p->name = strdup(name);
p->address = strdup(addr);
p->birthdate = strdup(bd);
p->gender = sex;
return p;
}
数秒しか必要ない場合は、patient
実際に必要以上のメモリを割り当てることを犠牲にして、メモリ管理を回避できます。
typedef struct {
int number;
char name[50]; // Declaring an array will allocate the specified
char address[200]; // amount of memory when the struct is created,
char birthdate[50]; // but pre-determines the max length and may
char gender; // allocate more than you need.
} patient;
リンクされたリスト:
一般に、リンクされたリストの目的は、順序付けられた要素のコレクションにすばやくアクセスできることを証明することです。に (おそらく患者番号が含まれている)llist
という要素が含まれている場合、実際の s 自体を保持するための追加のデータ構造が必要になり、毎回患者番号を検索する必要があります。num
patient
代わりに、宣言すると
typedef struct llist
{
patient *p;
struct llist *next;
} list;
次に、各要素にはpatient
構造体への直接ポインターが含まれ、次のようにデータにアクセスできます。
patient *getPatient(list *patients, int num) {
list *l = patients;
while (l != NULL) {
if (l->p->num == num) {
return l->p;
}
l = l->next;
}
return NULL;
}