#include<stdio.h>
#include<stdlib.h>
#define OVERFLOW -2
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int ElemType;
typedef int Status;
typedef struct QNode
{
ElemType data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct
{
QueuePtr front;
QueuePtr rear;
}LinkQueue;
Status InitQueue(LinkQueue *Q)
{
(*Q).front=(*Q).rear=(QueuePtr)malloc(sizeof(QNode));
if(!(*Q).front) exit(OVERFLOW);
(*Q).front->next=NULL;
return OK;
}
void ClearQueue(LinkQueue *Q)
{
(*Q).rear=(*Q).front->next; //之所以用rear是因为不想浪费变量 反正也是要清空
//不能改变front的信息 这样做会改变front的信息 最后一步找不到原本的front了
// while((*Q).rear)
// {
// (*Q).front=(*Q).rear->next;
// free((*Q).rear);
// (*Q).rear=(*Q).front;
// }
while((*Q).rear)
{
(*Q).front->next=(*Q).rear->next;
free((*Q).rear);
(*Q).rear=(*Q).front->next;
}
(*Q).rear=(*Q).front;
}
void DestoryQueue(LinkQueue *Q)
{
while((*Q).front)
{
(*Q).rear=(*Q).front->next;
free((*Q).front);
(*Q).front=(*Q).rear;
}
}
Status QueueEmpty(LinkQueue Q)
{
return Q.front==Q.rear?TRUE:FALSE;
}
int QueueLength(LinkQueue Q)
{
QueuePtr p=Q.front->next;
int i=0;
while(p)
{
i++;
p=p->next;
}
return i;
}
Status GetHead(LinkQueue Q,ElemType *e)
{
if(Q.front==Q.rear)
return ERROR;
*e=(Q.front->next)->data;
return OK;
}
Status EnQueue(LinkQueue *Q,ElemType e)
{
QueuePtr p;
p=(QueuePtr)malloc(sizeof(QNode));
if(!p) exit(OVERFLOW);
p->next=NULL;
p->data=e;
(*Q).rear->next=p;
(*Q).rear=p;
return OK;
}
Status DeQueue(LinkQueue *Q,ElemType *e)
{
QueuePtr p;
if((*Q).front==(*Q).rear)
return ERROR;
p=(*Q).front->next;
*e=p->data;
(*Q).front->next=p->next;
if((*Q).rear==p)
(*Q).rear=(*Q).front;
free(p);
return OK;
}
void TraverseQueue(LinkQueue Q,void (visit) (ElemType))
{
QueuePtr p;
p=Q.front->next;
while(p)
{
visit(p->data);
p=p->next;
}
}
void Print(ElemType e)
{
printf("%d ",e);
}
int main()
{
LinkQueue Q;
InitQueue(&Q);
int i,m,n;
for(i=1;i<=8;i++)
EnQueue(&Q,2*i-1);
printf("当前队中的元素有:\n");
TraverseQueue(Q,Print);
printf("\n");
printf("当前队中的队头元素是:");
GetHead(Q,&m);
printf("%d",m);
printf("\n");
printf("当前队中删除的元素有:\n");
for(i=1;i<=3;i++)
{
DeQueue(&Q,&n);
printf("%d ",n);
}
printf("\n");
printf("当前队中的元素有:\n");
TraverseQueue(Q,Print);
printf("\n");
printf("当前队中的队头元素是:");
GetHead(Q,&m);
printf("%d",m);
return 0;
}
测试结果:
当前队中的元素有:
1 3 5 7 9 11 13 15
当前队中的队头元素是:1
当前队中删除的元素有:
1 3 5
当前队中的元素有:
7 9 11 13 15
当前队中的队头元素是:7
Process returned 0 (0x0) execution time : 3.613 s
Press any key to continue.
Data Structure --- LinkQueue
猜你喜欢
转载自blog.csdn.net/qq_43779149/article/details/104214890
今日推荐
周排行