天天看点

3.4实现链队的各种运算

注意:

1.      销毁链队跟释放单链表一样

2.      释放的是结点,单纯的指针没有释放意义,所以指针变量可以无限赋值

3.      real指向对队尾结点

liqueue.cpp
//链队运算算法
#include <stdio.h>
#include <malloc.h>
typedef char ElemType;
typedef struct DataNode
{	
	ElemType data;
	struct DataNode *next;
} DataNode;				//链队数据结点类型
typedef struct
{	
	DataNode *front;
	DataNode *rear;
} LinkQuNode;			//链队类型
void InitQueue(LinkQuNode *&q)  
{	
	q=(LinkQuNode *)malloc(sizeof(LinkQuNode));
	q->front=q->rear=NULL;
}
void DestroyQueue(LinkQuNode *&q)
{
	DataNode *p=q->front,*r;//p指向队头数据结点
	if (p!=NULL)			//释放数据结点占用空间
	{	r=p->next;
		while (r!=NULL)
		{	free(p);
			p=r;r=p->next;
		}
	}
	free(p);
	free(q);				//释放链队结点占用空间
}
bool QueueEmpty(LinkQuNode *q)
{
	return(q->rear==NULL);
}
void enQueue(LinkQuNode *&q,ElemType e)
{	DataNode *p;
	p=(DataNode *)malloc(sizeof(DataNode));
	p->data=e;
	p->next=NULL;
	if (q->rear==NULL)		//若链队为空,则新结点是队首结点又是队尾结点
		q->front=q->rear=p;
	else
	{	q->rear->next=p;	//将p结点链到队尾,并将rear指向它
		q->rear=p;
	}
}
bool deQueue(LinkQuNode *&q,ElemType &e)
{	DataNode *t;
	if (q->rear==NULL)		//队列为空
		return false;
	t=q->front;				//t指向第一个数据结点
	if (q->front==q->rear)  //队列中只有一个结点时
		q->front=q->rear=NULL;
	else					//队列中有多个结点时
		q->front=q->front->next;
	e=t->data;
	free(t);
	return true;
}


exp3-4.cpp

#include"liqueue.cpp"
int main()
{
	ElemType e;
	LinkQuNode *q;
	printf(" (1)初始化链队q\n");
	InitQueue(q);
	printf(" (2)链队为%s \n",(QueueEmpty(q)?"空":"非空"));
	printf(" (3)依次进队元素a,b,c\n");
	enQueue(q,'a');
	enQueue(q,'b');
	enQueue(q,'c');
	printf(" (4)链队为%s \n",(QueueEmpty(q)?"空":"非空"));
	if(deQueue(q,e)==false)
		printf(" (5)队空,不能出队\n");
	else
		printf(" (5)出队一个元素 %c\n",e);
	printf(" (6)依次进队元素d,e,f\n");
	enQueue(q,'d');
	enQueue(q,'e');
	enQueue(q,'f');
	printf(" (7)链队为%s \n",(QueueEmpty(q)?"空":"非空"));
	printf(" (8)出队序列:");
	while(!QueueEmpty(q) )
	{
		deQueue(q,e);
		printf(" %c ",e);
		
	}
	
	printf("\n");
	printf(" (9)释放队列\n");
	DestroyQueue(q);
	return 1;
	
}