How to work with string fields in a C struct?

c, linked-list, string, structure

Solution

On strings and memory allocation:

A string in C is just a sequence of `char`s, so you can use `char *` or a `char` array wherever you want to use a string data type:

typedef struct     {
  int number;
  char *name;
  char *address;
  char *birthdate;
  char gender;
} patient;

Then you need to allocate memory for the structure itself, and for each of the strings:

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;
}

If you'll only need a few `patient`s, you can avoid the memory management at the expense of allocating more memory than you really need:

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;

On linked lists:

In general, the purpose of a linked list is to prove quick access to an ordered collection of elements. If your `llist` contains an element called `num` (which presumably contains the patient number), you need an additional data structure to hold the actual `patient`s themselves, and you'll need to look up the patient number every time.

Instead, if you declare

typedef struct llist
{
  patient *p;
  struct llist *next;
} list;

then each element contains a direct pointer to a `patient` structure, and you can access the data like this:

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;
}

Problem

I'm having trouble making a database based on a singly-linked list in C, not because of the linked list concept but rather the string fields in the struct themselves. This is an assignment in C and as far as I know (I'm a newbie), C doesn't recognize 'string' as a data type. This is what my struct code looks like: ``` typedef struct { int number; string name; string address; string birthdate; char gender; } patient; typedef struct llist { patient num; struct llist *next; } list; ``` I was thinking of making a struct for the strings themselves so that I can use them in the struct, like this: ``` typedef struct string { char *text; } *string; ``` Then I will `malloc()` each one of them when it is required to make new data of the string type (array of char). ``` typedef struct string { char *text; } *string; int main() { int length = 50; string s = (string) malloc(sizeof string); s->text = (char *) malloc(len * sizeof char); strcpy(s->text, patient.name->text); } ``` Can someone help me figure this out? Thank you.

Original source

Related problems