#ifndef LIST_H_ #define LIST_H_ enum _bool{false,true}; typedef enum _bool bool;/*代替c99的stdbool.h*/ /*特定于程序的声明*/ #define TSIZE 45 /*存放影片的数组大小*/ struct film { char title[TSIZE]; int rating; }; /*一般类型定义*/ typedef struct film Item; typedef struct node{ Item item; struct node * next; }Node; typedef Node * List; /*函数原型*/ /*操作:初始化一个列表*/ /*操作前:plist指向一个列表*/ /*操作后:该列表被初始化为空列表*/ void InitializeList(List * plist); /*操作:确定列表为空列表*/ /*操作前:plist指向一个已初始化的列表*/ /*操作后:如果该列表为空,则返回true,否则返回false*/ bool ListIsEmpty(const List * plist); /*操作:确定列表是否已满*/ /*操作前:plist指向一个已初始化的列表*/ /*操作后:如果该列表已满,则返回true,否则返回false*/ bool ListIsFull(const List * plist); /*操作:确定列表的项目个数*/ /*操作前:plist指向一个已初始化的列表*/ /*操作后:返回列表的项目的个数*/ unsigned int ListItemCount(const List * plist); /*操作:在列表尾部添加一个项目*/ /*操作前:item是将要被增加到列表的项目*/ /* plist指向一个已初始化的列表*/ /*操作后:如果可能,在列表添加一个新项目*/ /* 函数返回true,否则返回false*/ bool AddItem(Item item, List *plist); /*操作:把一个函数作用于列表中每个项目*/ /*操作前:plist指向一个已初始化的列表*/ /* pfun指向一个函数,函数接受一个*/ /* Item参数并无返回值*/ /*操作后:pfun指向的函数被作用到列表*/ /* 中的每个项目一次*/ void Traverse(const List * plist,void(* pfun)(Item item)); /*操作:释放已分配的内存(如果有的话)*/ /*操作前:plist指向一个已初始化的列表*/ /*操作后:为该列表分配的内存释放内存*/ /* 并且该列表被置为空列表*/ void EmptyTheList(List * plist); #endif //支持列表操作的函数 #include<stdio.h> #include<stdlib.h> #include"list.h" /*局部函数原型*/ static void CopyToNode(Item item,Node *plist); /*接口函数*/ /*把列表设置为空列表*/ void InitializeList( List * plist) { *plist = NULL; } /*如果列表为空则返回真*/ bool ListIsEmpty(const List * plist) { if(*plist == NULL) { return true; } else { return false; } } /*如果列表已满则返回真*/ bool ListIsFull(const List *plist) { Node * pt; bool full; pt = (Node *)malloc(sizeof(Node)); if(pt == NULL) { full = true; } else { full = false; } free(pt); return full; } /*返回节点数*/ unsigned int ListItemCount(const List *plist) { unsigned int count = 0; Node * pnode = *plist;/*设置到列表的开始处*/ while(pnode != NULL) { ++count; pnode = pnode->next; } return count; } /*创建存放项目的节点,并把它添加到由plist指向的列表 w尾部*/ bool AddItem(Item item,List *plist) { Node *pnew; Node *scan = *plist; pnew = (Node *)malloc(sizeof(Node)); if(pnew == NULL) { return false; } CopyToNode(item,pnew); pnew->next = NULL; if(scan == NULL) { *plist = pnew; } else { while(scan->next != NULL) scan = scan->next; scan->next = pnew; } return true; } /*访问每个节点并对它们分别执行由pfun指向的函数*/ void Traverse(const List *plist,void (* pfun)(Item item)) { Node *pnode = *plist; while(pnode != NULL) { (*pfun)(pnode->item); pnode = pnode->next; } } /*释放由malloc()分配的内存,把列表设置为NULL*/ void EmptyTheList(List *plist) { Node *psave; while(*plist != NULL) { psave = (*plist)->next; free(*plist); *plist = psave; } } /*局部函数定义,把一个项目复制到一个节点中*/ static void CopyToNode(Item item,Node *pnode) { pnode->item = item; } //ADT风格 #include<stdio.h> #include<stdlib.h> #include"list.h" void showmovies(Item item); int main(void) { List movies; Item temp; /*初始化*/ InitializeList(&movies); if(ListIsFull(&movies)) { fprintf(stderr,"No memory available!Bye!/n"); exit(1); } /*收集并存储*/ puts("Enter first movie title"); while(gets(temp.title) != 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)) { fprintf(stderr,"The list is now full/n"); break; } puts("Enter next movie title(empty line to stop)"); } /*显示*/ if(ListIsEmpty(&movies)) { printf("No data entered/n"); } else { printf("Here is the movies list:/n"); Traverse(&movies,showmovies); } printf("You entered %d movies./n",ListItemCount(&movies)); /*清除*/ EmptyTheList(&movies); printf("Bye!/n"); return 0; } void showmovies(Item item) { printf("Movies: %s Rating:%d/n",item.title,item.rating); } 2009-11-04