码迷,mamicode.com
首页 > 其他好文 > 详细

链表ADT实现

时间:2016-04-23 01:28:25      阅读:462      评论:0      收藏:0      [点我收藏+]

标签:

LIST.H

#ifndef LIST_H_
#define LIST_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 Node * List;


void InitializeList(List *plist);//初始化列表
bool ListIsEmpty(const List *plist);
bool ListIsFull(const List *plist);
unsigned int ListItemCount(const List *plist);
bool AddItem(Item item,List *plist);
void Traverse(const List *plist,void(*pfun)(Item item));
void EmptyTheList(List *plist);


#endif

 

 

LIST .C

 

#include<stdio.h>
#include<stdlib.h>
#include "list.h"

static void CopyToNode(Item item,Node *pnode);

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

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

void Traverse(const List *plist,void(*pfun)(Item item))
{
Node *pnode=*plist;
while(pnode!=NULL)
{
(*pfun)(pnode->item);
pnode=pnode->next;
}
}

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

 

MAIN.C

 

#include<stdio.h>
#include<stdlib.h>
#include "list.h"

void showmovies(Item item);
int main()
{
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))
{
puts("The list is now null");
break;
}
puts("Enter next movie title(empty line to stop):");
}
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));
EmptyTheList(&movies);
printf("Bye!\n");
return 0;
}

void showmovies(Item item)
{
printf("Movie:%s Rating:%d\n",item.title,item.rating);
}

 

通过ADT的修改 可以制造自己想要的操作

链表ADT实现

标签:

原文地址:http://www.cnblogs.com/HJL085/p/5423329.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!