怎么定义队列的结构体!!!!

2025-03-17 22:03:2867 次浏览

最佳答案

front表示的是指向队列头第一个元素指针。rear表示的是指向队列头最后一个元素指针。

我编写的队列的构造及其相关操作代码如下。望~~~

#define TRUE 1

#define FALSE 0

#define NULL 0

#define OK 1

#define OVERFLOW 0

#define ERROR 0

typedef int QElemType;

typedef int Status;

typedef struct QNode

{ QElemType data;

QNode *next;

}*QueuePtr;

struct LinkQueue

{ QueuePtr front,rear;//队头,队尾指针

};

//函数列表

void InitQueue(LinkQueue &Q);//构造一个空队列

void DestoryQueue(LinkQueue &Q);//销毁队列

void ClearQueue(LinkQueue &Q);//清空队列

Status QueueEmpty(LinkQueue Q);//判断队列是否为空

int QueueLength(LinkQueue Q);//求队列的长度

Status GetHead(LinkQueue Q,QElemType &e);//返回队头元素

void EnQueue(LinkQueue &Q,QElemType e);//插入元素为新的队尾元素

Status DeQueue(LinkQueue &Q,QElemType &e);//删除队头元素

void QueueTraverse(LinkQueue Q,void(*visit)(QElemType));

void print(QElemType e);

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

基本函数操作bo3_2.cpp

#include

#include

#include

#include"c3_2.h"

void InitQueue(LinkQueue &Q)

{//初始化一个队列

Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));

if(!Q.front)//生成头结点失败

exit(OVERFLOW);

Q.front->next=NULL;

}

void DestoryQueue(LinkQueue &Q)

{ //销毁队列

while(Q.front)

{ Q.rear=Q.front->next;//Q.rear指向Q.front的下一个结点

free(Q.front);//释放Q.front所指结点

Q.front=Q.rear;//Q.front指向Q.front的下一个结点

}

}

void ClearQueue(LinkQueue &Q)

{ //将队列清为空

DestoryQueue(Q);//销毁队列

InitQueue(Q);//重新构造队列

}

Status QueueEmpty(LinkQueue Q)

{ //判断队列是否为空

if(Q.front->next==NULL)

return TRUE;

else return FALSE;

}

int QueueLength(LinkQueue Q)

{ //求队列的长度

int i=0;//计数器清0

QueuePtr p=Q.front;//p指向结点

while(Q.rear!=p)//p所指向的不是尾结点

{ i++;//计数器加1

p=p->next;

}

return i;

}

Status GetHead(LinkQueue Q,QElemType &e)

{ //若队列不空,则用e返回队头元素

QueuePtr p;

if(Q.front==Q.rear) return ERROR;

p=Q.front->next;//p指向队头结点

e=p->data;//将队头元素的值赋给e

return OK;

}

void EnQueue(LinkQueue &Q,QElemType e)

{ //插入元素e为队列Q的新的队尾元素

QueuePtr p;

p=(QueuePtr)malloc(sizeof(QNode));

//动态生成新结点

if(!p)

exit(OVERFLOW);

p->data=e;//将e的值赋给新结点

p->next=NULL;//新结点的指针为空

Q.rear->next=p;//原队尾结点的指针域为指向新结点

Q.rear=p;//尾指针指向新结点

}

Status DeQueue(LinkQueue &Q,QElemType &e)

{ //若队列不为空,删除Q的队头元素,用e返回其值

QueuePtr p;

if(Q.front==Q.rear)//队列为空

return ERROR;

p=Q.front->next;//p指向队头结点

e=p->data;//队头元素赋给e

Q.front->next=p->next;//头结点指向下一个结点

if(Q.rear==p)//如果删除的队尾结点

Q.rear=Q.front;//修改队尾指针指向头结点

free(p);

return OK;

}

void QueueTraverse(LinkQueue Q,void(*visit)(QElemType))

{ //对队头到队尾依次对队列中每个元素调用函数visit()

QueuePtr p=Q.front->next;

while(p)

{ visit(p->data);//对p所指元素调用visit()

p=p->next;

}

printf("\n");

}

void print(QElemType e)

{ printf("%2d",e);

}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

主函数文件fun3_2.cpp

#include

#include"c3_2.h"

void main()

{ int i,k;

QElemType d;

LinkQueue q;

InitQueue(q);//构造一个空栈

for(i=1;i<=5;i++)

{ EnQueue(q,i);

}

printf("栈的元素为:");

QueueTraverse(q,print);

k=QueueEmpty(q);

printf("判断栈是否为空,k=%d(1:为空9;0:不为空)\n",k);

printf("将队头元素赋给d\n");

k=GetHead(q,d);

printf("队头元素为d=%d\n",d);

printf("删除队头元素:\n");

DeQueue(q,d);

k=GetHead(q,d);

printf("删除后新的队头元素为d=%d\n",d);

printf("此时队列的长度为%d\n",QueueLength(q));

ClearQueue(q);//清空队列

printf("清空队列后q.front=%u,q.rear=%u,q.front->next=%u\n",q.front,q.rear,q.front->next);

DestoryQueue(q);

printf("销毁队列后,q.front=%u,q.rear=%u\n",q.front,q.rear);

}

声明:知趣百科所有作品均由用户自行上传分享,仅供网友学习交流。若您的权利被侵害,请在页面底部查找“联系我们”的链接,并通过该渠道与我们取得联系以便进一步处理。