//带头结点的队列链式存储及基本操作
#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;
}
}
07-30
310
01-19
775