list.h
#include <stdio.h>
#include <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 struct list
{
Node * head;
int size;
}List;
void InitializeList(List * plist);
bool ListIsFull(List plist);
bool AddItem(Item item,List * plist);
bool ListIsEmpty(List plist);
void Traverse(List plist,void (*pfun)(Item item));
int ListItemCount(List plist);
void EmptyTheList(List * plist);
main.c
#include <stdio.h>
#include <stdlib.h>
#include "list.h"
static void showmovies(Item item);
int main(void)
{
List movies;
Item temp;
InitializeList(&movies);
if(ListIsFull(movies))
{
puts("内存不足");
exit(1);
}
puts("输入第一部电影:");
while(gets(temp.title)!=NULL && temp.title[0]!='\0')
{
puts("输入电影评分<0-10>: ");
scanf("%d",&temp.rating);
while(getchar()!='\n')
continue;
if(AddItem(temp,&movies)==false)
{
puts("分配内存问题");
break;
}
if(ListIsFull(movies))
{
puts("这电影列表现已满.");
break;
}
puts("输入下一部电影标题(空行退出): ");
}
if(ListIsEmpty(movies))
puts("没有数据");
else
{
puts("显示电影列表:");
Traverse(movies,showmovies);
}
printf("你输入了%d部电影.\n",ListItemCount(movies));
EmptyTheList(&movies);
printf("Bye!\n");
return 0;
}
void showmovies(Item item)
{
printf("电影: %s 评分: %d\n",item.title,item.rating);
}
list.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "list.h"
void InitializeList(List * plist)
{
plist->head=NULL;
plist->size=0;
}
bool ListIsFull(List plist)
{
Node * pr;
pr=(Node *)malloc(sizeof(Node));
if(pr==NULL)
return true;
else
{
free(pr);
return false;
}
}
bool AddItem(Item item,List * plist)
{
Node * pnew;
Node * scan;
scan=plist->head;
pnew=(Node *)malloc(sizeof(Node));
if(pnew==NULL)
return false;
pnew->item=item;
pnew->next=NULL;
plist->size++;
if(scan==NULL)
plist->head=pnew;
else
{
while(scan->next!=NULL)
scan=scan->next;
scan->next=pnew;
}
return true;
}
bool ListIsEmpty(List plist)
{
if(plist.head==NULL)
return true;
else
return false;
}
void Traverse(List plist,void (*pfun)(Item item))
{
Node * pnode=plist.head;
while(pnode!=NULL)
{
(*pfun)(pnode->item);
pnode=pnode->next;
}
}
int ListItemCount(List plist)
{
return plist.size;
}
void EmptyTheList(List * plist)
{
Node * pnode;
Node * head=plist->head;
while(head!=NULL)
{
pnode=head->next;
free(head);
head=pnode;
}
}