关于字符串和内存分配:
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
s,则可以避免内存管理,但会分配比实际需要更多的内存:
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
包含一个名为的元素num
(可能包含患者编号),您需要一个额外的数据结构来保存实际patient
的 s 本身,并且您每次都需要查找患者编号。
相反,如果您声明
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;
}