您的位置:首页 > 理论基础 > 数据结构算法

【数据结构】链式队列

2015-02-10 14:41 281 查看
//linkqueue.h
#include "stdio.h"
#include "stdlib.h"
#include <string.h>
#define MAXSZIE 30

struct qNode
{	char name[MAXSZIE];
char author[MAXSZIE];
int Pages;
double Price;
char IsForeign;
struct qNode * next;
};
typedef struct qNode QNode,*pNode;

typedef struct  
{
	pNode front;
	pNode rear;
	int size;
}LinkQueue;

void InitQueue(LinkQueue *LQ);
//1.Init queue

int  QueueEmpty(LinkQueue LQ);
//1.if queue is  nut empty return 1;
//2.if queue is empty return 0;

int enqueue( LinkQueue *LQ,QNode item) ;
//1.Check that the queue and the item are not empty. Return -1 if they are.
//2.Create a new Record to save the data received from item. This Record will be added to the queue.
//3.Find the end of the queue. Be mindful that the queue may be empty. 
//4.Return the value of a counter with the new size of the queue.

int dequeue(LinkQueue *LQ, QNode *item); 
//1.Check if the queue is empty, if so the program will print “Nothing to dequeue!” and return -1.
//2.If the queue is not empty, copy the data of the front element into the Record item and remove the front element from the queue. 
//3. free its memory. Return 1 when finished.

int GetHead(LinkQueue LQ,QNode item);
//1.If the queue is not empty,return the head item name;

void destroyQueue(LinkQueue * LQ) ;
//1.The method will dequeue and free the memory of all the elements in the queue.

void DislayQueue(LinkQueue LQ);
//1.printf all the elements in the queue.
//linkqueue.c


#include "QueueADT.h"

void InitQueue(LinkQueue *LQ)
{
	LQ->front=(pNode)malloc(sizeof(QNode));
	if(LQ->front==NULL) exit(-1);
	LQ->front->next=NULL;
	LQ->rear=LQ->front;
	LQ->size=0;
}

int QueueEmpty( LinkQueue LQ )
{
	if(LQ.rear->next==NULL)
		return 1;
	else 
		return 0;
}

int enqueue( LinkQueue *LQ,QNode item )
{
	QNode *s=(QNode *)malloc(sizeof(QNode));
	if(!s) exit(-1);
	strcpy(s->author,item.author);
	s->IsForeign=item.IsForeign;
	strcpy(s->name,item.name);
	s->Pages=item.Pages;
	s->Price=item.Price;
	s->next=NULL;
	LQ->rear->next=s;
	LQ->rear=s;
	LQ->size++;
	return LQ->size;
	
}

int dequeue( LinkQueue *LQ, QNode *item )
{
	QNode *s;
	if(LQ->front==LQ->rear)
		return -1;
	else{
		s=LQ->front->next;
		strcpy(item->author,s->author);
		item->IsForeign=s->IsForeign;
		strcpy(item->name,s->name);
		item->Pages=s->Pages;
		item->Price=s->Price;
		LQ->front->next=s->next;
		if(LQ->rear==s)LQ->rear=LQ->front;
		free(s);
		return 1;
	}
	
}

int GetHead( LinkQueue LQ,QNode item )
{	
	QNode *s;
	if(LQ.rear==LQ.front)
		return 0;
	else
	{
		s=LQ.front->next;
		strcpy(item.author,s->author);
		item.IsForeign=s->IsForeign;
		strcpy(item.name,s->name);
		item.Pages=s->Pages;
		item.Price=s->Price;
		return 1;

	}
	
}

void destroyQueue( LinkQueue * LQ )
{		QNode *s;

	if(LQ->front!=LQ->rear)
	{
		s=LQ->front->next;
		LQ->front->next=s->next;
		if(LQ->rear==s)LQ->rear=LQ->front;
		free(s);
		destroyQueue(LQ);
	}else
	{
		LQ->rear->next=LQ->front;
	}
}

void DislayQueue( LinkQueue LQ )
{
	QNode * p;
	int i=1;
	printf("  ID                          NAME              AUTHOR         PAGES    PRICE      ISFOREIGN\n");
	p=LQ.front->next;
	while(p&&QueueEmpty(LQ)==1)
	{
	printf("[%2d]:%30s %25s%5d %10.2f %10c\n", i, p->name,p->author ,p->Pages, p->Price,p->IsForeign);
	i++;
	p=p->next;
	}
	printf("\nSIZE = %d\n",i-1);
	printf("************************************************************************************************\n");
	
}

main.c

//gt Final Grade 100/100

//gt Program compiles and runs

#include "QueueADT.h"

/*
author:zhaoke
date:2014.12.4
project:QueueADT.
*/

void main()
{	int i=0;
	QNode p;
	LinkQueue LQ;
///////////////////////////////////////////////////////////////////////
	InitQueue(&LQ);
//	add item to Qrere
	strcpy(p.name,"Romance of the Three Kingdoms");
	strcpy(p.author,"LuoGuanZhong");
	p.Price=50.5;
	p.Pages=365;
	p.IsForeign='N';
	enqueue(&LQ,p);

	strcpy(p.name,"Water Margin");
	strcpy(p.author,"ShiNaiAn");
	p.Price=80.5;
	p.Pages=465;
	p.IsForeign='N';
	enqueue(&LQ,p);

	strcpy(p.name,"A Dream of Red Mansions");
	strcpy(p.author,"CaoXueQin");
	p.Price=46.5;
	p.Pages=532;
	p.IsForeign='N';
	enqueue(&LQ,p);;

	strcpy(p.name,"Jane Eyre");
	strcpy(p.author,"Charlotte Bronte");
	p.Price=66.5;
	p.Pages=432;
	p.IsForeign='Y';
	enqueue(&LQ,p);

	strcpy(p.name,"the making of steel");
	strcpy(p.author,"Pavel Korchagin");
	p.Price=85.5;
	p.Pages=432;
	p.IsForeign='Y';
	enqueue(&LQ,p);

	strcpy(p.name,"Robinson Crusoe");
	strcpy(p.author,"Daniel Defoe");
	p.Price=85.5;
	p.Pages=672;
	p.IsForeign='Y';
	enqueue(&LQ,p);

	strcpy(p.name,"The Merchant of Venice");
	strcpy(p.author,"WilliamShakesbeare");
	p.Price=95.5;
	p.Pages=572;
	p.IsForeign='Y';
	enqueue(&LQ,p);

	strcpy(p.name,"The Tragedy of Hamlet");
	strcpy(p.author,"WilliamShakesbeare");
	p.Price=95.5;
	p.Pages=1072;
	p.IsForeign='Y';
	enqueue(&LQ,p);

	strcpy(p.name,"Othello");
	strcpy(p.author,"WilliamShakesbeare");
	p.Price=95.5;
	p.Pages=882;
	p.IsForeign='Y';
	enqueue(&LQ,p);

	strcpy(p.name,"The life of King Henry Ⅷ");
	strcpy(p.author,"WilliamShakesbeare");
	p.Price=105.5;
	p.Pages=682;
	p.IsForeign='Y';
	enqueue(&LQ,p);

	strcpy(p.name," Les Misrables  ");
	strcpy(p.author,"Victor Hugo");
	p.Price=85.5;
	p.Pages=452;
	p.IsForeign='Y';
	enqueue(&LQ,p);

	strcpy(p.name,"Notre-Dame de Paris");
	strcpy(p.author,"Victor Hugo");
	p.Price=85.5;
	p.Pages=752;
	p.IsForeign='Y';
	enqueue(&LQ,p);

	strcpy(p.name,"Red Sorghum");
	strcpy(p.author,"MoYan");
	p.Price=85.5;
	p.Pages=642;
	p.IsForeign='N';
	enqueue(&LQ,p);

	strcpy(p.name,"Wa");
	strcpy(p.author,"MoYan");
	p.Price=23.5;
	p.Pages=452;
	p.IsForeign='N';
	enqueue(&LQ,p);;

	strcpy(p.name,"Sadness into river upstream");
	strcpy(p.author,"Jing M.Guo");
	p.Price=52.5;
	p.Pages=552;
	p.IsForeign='N';
	enqueue(&LQ,p);

	strcpy(p.name,"Tiny Times");
	strcpy(p.author,"Jing M.Guo");
	p.Price=58.5;
	p.Pages=512;
	p.IsForeign='N';
	enqueue(&LQ,p);

	strcpy(p.name," Let the wind cutting dusts");
	strcpy(p.author,"Jing M.Guo");
	p.Price=28.5;
	p.Pages=532;
	p.IsForeign='N';
	enqueue(&LQ,p);

	strcpy(p.name,"Triple gate");
	strcpy(p.author,"HanHan");
	p.Price=58.5;
	p.Pages=132;
	p.IsForeign='N';
	enqueue(&LQ,p);

	strcpy(p.name,"Ordinary world");
	strcpy(p.author,"LuYao");
	p.Price=16.5;
	p.Pages=1324;
	p.IsForeign='N';
	enqueue(&LQ,p);

	strcpy(p.name,"If you well is sunny");
	strcpy(p.author,"BaiLuoMei");
	p.Price=58.5;
	p.Pages=263;
	p.IsForeign='N';
	enqueue(&LQ,p);
////////////////////////////////////////////////////////////////////
	printf("Creating data and pushing it to the Queue:\n");
	DislayQueue(LQ);

////////////////////////////////////////////////////////////////////
	strcpy(p.name,"DateStruct");
	strcpy(p.author,"YanWeiMin");
	p.Price=60.3;
	p.Pages=280;
	p.IsForeign='N';
	enqueue(&LQ,p);
	printf("Pushing new value on Queue:\n");
	DislayQueue(LQ);
////////////////////////////////////////////////////////////////////
	printf("Delete 5 elements from the Queue:\n\n");
	for(i=0;i<5;i++)
	{
		dequeue(&LQ, &p );
		printf("ElementName[%d]:%s\n",i+1,p.name);
	}
	DislayQueue(LQ);
//////////////////////////////////////////////////////////////////
	if(QueueEmpty(LQ)!=1)
	{
		printf("Queue is empty\n");
	}
	else
	{
		printf("Queue is NOT empty\n");
	}
	DislayQueue(LQ);
//////////////////////////////////////////////////////////////////
	printf("Destroying the Queue\n");
	destroyQueue(&LQ);
	if(QueueEmpty(LQ)!=1)
	{
		printf("Queue is empty\n");
	}
	else
	{
		printf("Queue is NOT empty\n");
	}

	DislayQueue(LQ);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: