#include <stdio.h>
#include <stdlib.h>
typedef int QElemType;
typedef int Status;
typedef struct QNode{
QElemType data;
struct QNode*next;
}QNode,*QueuePtr;
typedef struct{
QueuePtr front; //队头指针,始终指向头结点
QueuePtr rear; //队尾指针,指向最后一个结点
int num;
}LinkQueue;
Status InitQueue(LinkQueue *s){
QueuePtr umi=(QueuePtr)malloc(sizeof(QNode));
s->front = s->rear = umi;
s->front->next = NULL;//将头指针置空
s->num = 0;
return 1;
}
Status ClearQueue(LinkQueue *umi){ //将队列清空
if (umi->front == umi->rear){
printf("Empty!\n");
return 0;
}
QueuePtr p;
p = umi->front->next;
while (umi->front != umi->rear){
umi->front = p->next;
free(p);
p = umi->front;
}
umi->front = 0;
return 1;
}
Status QueueEmpty(LinkQueue *umi){ //若队列为空返回1否则返回0
int yuki = 0;
if (!QueueLength(umi)){
yuki = 1;
}
return yuki;
}
Status QueueLength(LinkQueue *umi){ //返回队列的长度
return umi->num;
}
Status GetHead(LinkQueue *umi){ //返回队头元素
return umi->front->next->data;
}
Status EnQueue(LinkQueue *umi,QElemType e){ //插入元素e为队尾元素
QueuePtr s=(QueuePtr)malloc(sizeof(QNode));
s->data = e;
s->next = NULL;
umi->rear->next = s;
umi->rear = s;
umi->num++;
return 1;
}
Status DeQueue(LinkQueue *umi,QElemType *e){ //删除队头元素,并用e返回其值
if (umi->front == umi->rear){
printf("Empty!\n");
return 0;
}
QueuePtr p;
p = umi->front->next;
*e = p->data;
umi->front->next = p->next;
if (umi->rear == p) //若删去了最后一个元素,队尾指针指向头结点
umi->rear = umi->front;
free(p);
umi->num--;
return 1;
}
Status QueueTraverse(LinkQueue *umi){ //从队头到队尾进行访问
if (QueueEmpty(umi)){
printf("Empty!\n");
return 0;
}
QueuePtr p=umi->front->next;
while (p){
printf("%d\n", p->data);
p = p->next;
}
return 1;
}
int main(){
LinkQueue L;
int a;
InitQueue(&L);
EnQueue(&L, 1);
DeQueue(&L, &a);
QueueTraverse(&L);
/*if (QueueEmpty(&L)){
printf("Empty!");
}
else printf("Several");*/
}
在写出队列的代码实现后,我回忆起了与链表的相似性,正如老师所说,学会了链表之后,对于其余链式数据结构就有了更清楚的认识,写起来也更简单