带头结点的队列链式存储及基本操作

//带头结点的队列链式存储及基本操作
#include <stdio.h>
#include <stdlib.h>
typedef int ElementType;
 
typedef struct QNode *PtrQNode;
struct QNode{
	ElementType Data;
	PtrQNode Next;
};

typedef PtrQNode Position;
typedef struct Queue *PtrQueue;
struct Queue{
	Position Front,Rear;//Front指向不存数据的头结点,Rear指向最后一个节点 
};//Front不指向带数据的节点是为了区分空队和一个元素的队列 

PtrQueue CreateQueue();
void AddQ(PtrQueue Q,ElementType X);
bool IsEmpty(PtrQueue Q);
ElementType DeleteQ(PtrQueue Q);
bool Print(PtrQueue Q); 
int main()
{
	PtrQueue Q;
	Q=CreateQueue();
	printf("测试AddQ函数:\n");
	for(int i=0;i<10;i++){
		AddQ(Q,3*i);
	}
	Print(Q);
	printf("\n");
	printf("测试DeleteQ函数:%d\n",DeleteQ(Q));
	DeleteQ(Q);
	Print(Q);
	return 0;
}
PtrQueue CreateQueue()
{
	PtrQNode pqn;
	PtrQueue pq;
	pqn=(PtrQNode)malloc(sizeof(struct QNode));
	pqn->Next=NULL;
	pq=(PtrQueue)malloc(sizeof(struct Queue));
	pq->Front=pq->Rear=pqn;
	return pq; 
}
void AddQ(PtrQueue Q,ElementType X)
{
	PtrQNode pqn=(PtrQNode)malloc(sizeof(struct QNode));
	pqn->Data=X;
	pqn->Next=NULL;
	Q->Rear->Next=pqn;
	Q->Rear=pqn;
}
bool IsEmpty(PtrQueue Q)
{
	if(Q->Front==Q->Rear)
		return true;
	else
		return false;
}
ElementType DeleteQ(PtrQueue Q)
{
	if(IsEmpty(Q)){
		printf("队空不能删除\n");
		return 404;
	}
	else{
		PtrQNode p;
		ElementType Data;
		p=Q->Front;
		Data=p->Next->Data;
		Q->Front=Q->Front->Next;
		free(p); //把头结点丢弃,并把第一个节点作为头结点 
		return Data;
	}
}
bool Print(PtrQueue Q)
{
	PtrQNode p=Q->Front;;
	if(IsEmpty(Q)){
		printf("队列为空不能Print。\n");
		return false;
	}
	else{
		while(p!=Q->Rear){
			p=p->Next;
			printf("%d ",p->Data);
		}
		return true;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值