|
/* 队列是一种先进先出线性表,队列是线性表的特化 也具有线性表的性质分为:顺序队列与链式队列 链式队列与线性表的单链表相似只不过链式队列只 允许从头部进行删除、尾部进行插入.需要为链式队列 创建一个头结点包括两个指针,指向队头的指针(front) 与指向队尾的指针(rear).当两个指针相等时队列为空*/- #ifndef LINKQUEUE_H
- #define LINKQUEUE_H
- typedef int ElemType; //队列的数据类型
- typedef struct node{
- ElemType data; //队列的数据类型
- struct node *next; //指向下一个结点
- }QueNode,*QuePtr;
- typedef struct{
- QuePtr front; //指向队头的指针
- QuePtr rear; //指向队尾的指针
- }LinkQueue;
- void InitQueue(LinkQueue *q); //初始化队列
- void CreateQueue(LinkQueue *q); //创建队列
- void EnQueue(LinkQueue *q,ElemType e); //进队操作,将元素e压入队列中
- void DeQueue(LinkQueue *q,ElemType *e); //出队操作,将出队的元素存入*e中
- int GetQueueLength(LinkQueue *q); //获取队列的长度
- void Print(LinkQueue *q); //打印队列的元素
- void Clear(LinkQueue *q); //清空队列
- void TopQueue(LinkQueue *q,ElemType *e); //返回队头的元素
- #endif //LINKQUEUE_H
- #include "LinkQueue.h"
- #include <stdio.h>
- #include <stdlib.h>
- void InitQueue(LinkQueue *q) //初始化队列
- {
- q->front = q->rear = (QuePtr)malloc(sizeof(QueNode)); //初始化队头与队尾的指针指向头结点
- q->front->next = NULL;
- }
- void CreateQueue(LinkQueue *q) //创建队列
- {
- InitQueue(q);
- printf("请输入要进队的元素以CTRL+Z结尾\n");
- int k;
- while((scanf("%d",&k)) != EOF)
- EnQueue(q,k);
- }
- void EnQueue(LinkQueue *q,ElemType e) //将元素e进队
- {
- QuePtr temp = (QuePtr)malloc(sizeof(QueNode)); //创建新结点
- if(temp) //如果内存分配成功
- {
- temp->data = e; //初始化新结点的数据为e
- temp->next = NULL; //队列只能从队尾插入所以下一个结点初始化为NULL
- q->rear->next = temp; //将队尾结点的指针指向新结点,如果新结点为第一个结点则q->rear->next相当于q->front->next
- q->rear = temp; //将指向队尾的指针指向新结点
- }
- }
- void DeQueue(LinkQueue *q,ElemType *e) //队头的结点出队,将出队的结点的元素存入*e
- {
- if(q->front == q->rear) //队列为空
- return;
- QuePtr temp = q->front->next; //初始化temp为要出队的结点的指针
- if(q->front->next == q->rear) //如果要出队的结点为最后一个结点,使q->rear指向头结点防止出现悬空的指针
- q->rear = q->front;
- *e = temp->data; //将出队的数据元素存入*e
- q->front->next = temp->next; //使下一个结点成为队头,如果没有下一个结点则为NULL
- free(temp); //删除要出队的结点
- }
- bool IsEmpty(LinkQueue *q) //判断队列是否为空
- {
- if(q->front == q->rear)
- return true;
- return false;
- }
- int GetQueueLength(LinkQueue *q) //返回队列的长度
- {
- QuePtr temp = q->front;
- int i = 0;
- while(temp != q->rear)
- {
- ++i;
- temp = temp->next;
- }
- return i;
- }
- void Clear(LinkQueue *q) //清空队列
- {
- QuePtr temp = q->front->next;
- while(temp)
- {
- QuePtr tp = temp;
- temp = temp->next;
- free(tp);
- }
- temp = q->front;
- q->front = q->rear = NULL;
- free(temp);
- }
- void Print(LinkQueue *q) //打印队列的元素
- {
- if(q->front == q->rear)
- return;
- QuePtr temp = q->front->next;
- while(temp != q->rear)
- {
- printf("%d ",temp->data);
- temp = temp->next;
- }
- printf("%d",temp->data);
- printf("\n");
- }
- void TopQueue(LinkQueue *q,ElemType *e) //返回队头的结点元素存入*e
- {
- if(q->front == q->rear)
- return;
- *e = q->front->next->data;
- }
-
- #include "LinkQueue.h"
- #include <stdio.h>
- int main()
- {
- LinkQueue q;
- CreateQueue(&q);
- Print(&q);
- int top;
- TopQueue(&q,&top);
- printf("队头的元素为:%d\n",top);
- int len = GetQueueLength(&q);
- int k;
- printf("将队列中的所有元素出队:\n");
- for(int i = 0;i < len;++i)
- {
- DeQueue(&q,&k);
- printf("%d ",k);
- }
- printf("\n");
- Clear(&q);
- return 0;
- }
复制代码 作者:flying0033 发表于2011-12-23 23:58:54 原文链接 |
|