C语言链表实例 C语言结构链表实例 C语言队列实例 C语言链表实例 /* list.h -- header file for a simple list type */ #ifndef LIST_H_ #define LIST_H_ #include <stdbool.h> /* C99 feature */ /* program-specific declarations */ #define TSIZE 45 /* size of array to hold title */ struct film { char title[TSIZE]; int rating; }; /* general type definitions */ typedef struct film Item; typedef struct node { Item item; struct node * next; } Node; typedef Node * List; /* function prototypes */ /* operation: initialize a list */ /* preconditions: plist points to a list */ /* postconditions: the list is initialized to empty */ void InitializeList(List * plist); /* operation: determine if list is empty */ /* plist points to an initialized list */ /* postconditions: function returns True if list is empty */ /* and returns False otherwise */ bool ListIsEmpty(const List *plist); /* operation: determine if list is full */ /* plist points to an initialized list */ /* postconditions: function returns True if list is full */ /* and returns False otherwise */ bool ListIsFull(const List *plist); /* operation: determine number of items in list */ /* plist points to an initialized list */ /* postconditions: function returns number of items in list */ unsigned int ListItemCount(const List *plist); /* operation: add item to end of list */ /* preconditions: item is an item to be added to list */ /* plist points to an initialized list */ /* postconditions: if possible, function adds item to end */ /* of list and returns True; otherwise the */ /* function returns False */ bool AddItem(Item item, List * plist); /* operation: apply a function to each item in list */ /* plist points to an initialized list */ /* pfun points to a function that takes an */ /* Item argument and has no return value */ /* postcondition: the function pointed to by pfun is */ /* executed once for each item in the list */ void Traverse (const List *plist, void (* pfun)(Item item) ); /* operation: free allocated memory, if any */ /* plist points to an initialized list */ /* postconditions: any memory allocated for the list is freed */ /* and the list is set to empty */ void EmptyTheList(List * plist); #endif /* films3.c -- using an ADT-style linked list */ /* compile with list.c */ #include <stdio.h> #include <stdlib.h> /* prototype for exit() */ #include "list.h" /* defines List, Item */ void showmovies(Item item); char * s_gets(char * st, int n); int main(void) { List movies; Item temp; /* initialize */ InitializeList(&movies); if (ListIsFull(&movies)) { fprintf(stderr,"No memory available! Bye!\n"); exit(1); } /* gather and store */ puts("Enter first movie title:"); while (s_gets(temp.title, TSIZE) != NULL && temp.title[0] != '\0') { puts("Enter your rating <0-10>:"); scanf("%d", &temp.rating); while(getchar() != '\n') continue; if (AddItem(temp, &movies)==false) { fprintf(stderr,"Problem allocating memory\n"); break; } if (ListIsFull(&movies)) { puts("The list is now full."); break; } puts("Enter next movie title (empty line to stop):"); } /* display */ if (ListIsEmpty(&movies)) printf("No data entered. "); else { printf ("Here is the movie list:\n"); Traverse(&movies, showmovies); } printf("You entered %d movies.\n", ListItemCount(&movies)); /* clean up */ EmptyTheList(&movies); printf("Bye!\n"); return 0; } void showmovies(Item item) { printf("Movie: %s Rating: %d\n", item.title, item.rating); } char * s_gets(char * st, int n) { char * ret_val; char * find; ret_val = fgets(st, n, stdin); if (ret_val) { find = strchr(st, '\n'); // look for newline if (find) // if the address is not NULL, *find = '\0'; // place a null character there else while (getchar() != '\n') continue; // dispose of rest of line } return ret_val; } C语言结构链表实例 C语言队列实例