Lecture
To complete the discussion of doubly linked lists, this section presents a simple but complete program for working with a mailing list. During operation, the entire list is stored in RAM. However, it can be saved in a file and uploaded for further work.
/ * Simple program to handle mailing lists illustrating working with doubly linked lists. * / #include <stdio.h> #include <stdlib.h> #include <string.h> struct address { char name [30]; char street [40]; char city [20]; char state [3]; char zip [11]; struct address * next; / * pointer to the next entry * / struct address * prior; / * pointer to the previous entry * / }; struct address * start; / * pointer to the first entry in the list * / struct address * last; / * last record pointer * / struct address * find (char *); void enter (void), search (void), save (void); void load (void), list (void); void mldelete (struct address **, struct address **); void dls_store (struct address * i, struct address ** start, struct address ** last); void inputs (char *, char *, int), display (struct address *); int menu_select (void); int main (void) { start = last = NULL; / * initialize start and end pointers * / for (;;) { switch (menu_select ()) { case 1: enter (); / * enter address * / break; case 2: mldelete (& start, & last); / * delete address * / break; case 3: list (); / * list display * / break; case 4: search (); / * address search * / break; case 5: save (); / * write list to file * / break; case 6: load (); / * read from disk * / break; case 7: exit (0); } } return 0; } / * Select user action. * / int menu_select (void) { char s [80]; int c; printf ("1. Entering the name \ n"); printf ("2. Deleting a name \ n"); printf ("3. Display the contents of the list \ n"); printf ("4. Search \ n"); printf ("5. Save to file \ n"); printf ("6. Download from file \ n"); printf ("7. Exit \ n"); do { printf ("\ nYour choice:"); gets (s); c = atoi (s); } while (c <0 || c> 7); return c; } / * Enter the name and addresses. * / void enter (void) { struct address * info; for (;;) { info = (struct address *) malloc (sizeof (struct address)); if (! info) { printf ("\ nNo free memory"); return; } inputs ("Enter name:", info-> name, 30); if (! info-> name [0]) break; / * complete input * / inputs ("Enter the street:", info-> street, 40); inputs ("Enter city:", info-> city, 20); inputs ("Enter State:", info-> state, 3); inputs ("Enter postal code:", info-> zip, 10); dls_store (info, & start, & last); } / * input cycle * / } / * The following function enters a string from the keyboard no longer count and prevents overflow lines. In addition, it displays a hint. * / void inputs (char * prompt, char * s, int count) { char p [255]; do { printf (prompt); fgets (p, 254, stdin); if (strlen (p)> count) printf ("\ nNow too long \ n"); } while (strlen (p)> count); p [strlen (p) -1] = 0; / * remove the newline character * / strcpy (s, p); } / * Create an ordered doubly linked list. * / void dls_store ( struct address * i, / * new element * / struct address ** start, / * first list item * / struct address ** last / * last list item * / ) { struct address * old, * p; if (* last == NULL) {/ * first list item * / i-> next = NULL; i-> prior = NULL; * last = i; * start = i; return; } p = * start; / * start at the beginning of the list * / old = NULL; while (p) { if (strcmp (p-> name, i-> name) <0) { old = p; p = p-> next; } else { if (p-> prior) { p-> prior-> next = i; i-> next = p; i-> prior = p-> prior; p-> prior = i; return; } i-> next = p; / * new first item * / i-> prior = NULL; p-> prior = i; * start = i; return; } } old-> next = i; / * insert at the end * / i-> next = NULL; i-> prior = old; * last = i; } / * Remove item from list. * / void mldelete (struct address ** start, struct address ** last) { struct address * info; char s [80]; inputs ("Enter name:", s, 30); info = find (s); if (info) { if (* start == info) { * start = info-> next; if (* start) (* start) -> prior = NULL; else * last = NULL; } else { info-> prior-> next = info-> next; if (info! = * last) info-> next-> prior = info-> prior; else * last = info-> prior; } free (info); / * free memory * / } } / * Address search. * / struct address * find (char * name) { struct address * info; info = start; while (info) { if (! strcmp (name, info-> name)) return info; info = info-> next; / * go to the next address * / } printf ("Name not found. \ n"); return NULL; / * no matching item * / } / * Display the entire list on the screen. * / void list (void) { struct address * info; info = start; while (info) { display (info); info = info-> next; / * go to the next address * / } printf ("\ n \ n"); } / * This function performs the actual output to the screen. all fields of the record containing the address. * / void display (struct address * info) { printf ("% s \ n", info-> name); printf ("% s \ n", info-> street); printf ("% s \ n", info-> city); printf ("% s \ n", info-> state); printf ("% s \ n", info-> zip); printf ("\ n \ n"); } / * Search for a name in the list. * / void search (void) { char name [40]; struct address * info; printf ("Enter name:"); gets (name); info = find (name); if (! info) printf ("Not found \ n"); else display (info); } / * Save the list to disk file. * / void save (void) { struct address * info; FILE * fp; fp = fopen ("mlist", "wb"); if (! fp) { printf ("Unable to open file. \ n"); exit (1); } printf ("\ nSave to file \ n"); info = start; while (info) { fwrite (info, sizeof (struct address), 1, fp); info = info-> next; / * go to the next address * / } fclose (fp); } / * Load addresses from file. * / void load () { struct address * info; FILE * fp; fp = fopen ("mlist", "rb"); if (! fp) { printf ("Unable to open file. \ n"); exit (1); } / * free memory if there is already a list in memory * / while (start) { info = start-> next; free (info); start = info; } / * reset the start and end pointers * / start = last = NULL; printf ("\ nLoad from file \ n"); while (! feof (fp)) { info = (struct address *) malloc (sizeof (struct address)); if (! info) { printf ("No free memory"); return; } if (1! = fread (info, sizeof (struct address), 1, fp)) break; dls_store (info, & start, & last); } fclose (fp); }
Comments
To leave a comment
Structures and data processing algorithms.
Terms: Structures and data processing algorithms.