您的位置:首页 > 其它

链队列

2016-05-07 00:03 274 查看
//链队列
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>

typedef struct QNode
{
int data;
struct QNode *next;
}QNode,*QueuePtr;

typedef struct LinkQueue
{
QueuePtr front, rear;
}LinkQueue;

bool InitQueue(LinkQueue *q); //队列的初始化
void QueueEmpty(LinkQueue q); //判断队列是否为空
int QueueLength(LinkQueue q); //求队列长度
bool EnQueue(LinkQueue *q,int e);//插入元素e 为q的新的队尾元素
bool QueueTraverse(LinkQueue *q); //输出队列元素
bool GetHead(LinkQueue q,int *e); //输出队头元素
bool DeQueue(LinkQueue *q,int *e); //删除队头元素,并将队头元素赋给e
bool ClearQueue(LinkQueue *q); //清空队列
bool DestoryQueue(LinkQueue *q); //销毁队列

int main()
{
int d, length;
int val; //删除的队头元素
int h; //队头元素
LinkQueue q;
InitQueue(&q);
if(InitQueue(&q))
printf("成功地构造了一个空队列!\n");
QueueEmpty(q); //判断队列是否为空
length = QueueLength(q);
printf("队列的长度为%d\n",length);
EnQueue(&q,-5);  //插入队头元素
EnQueue(&q,5);
EnQueue(&q,10);

length = QueueLength(q); //队列元素的长度
printf("队列的长度为%d\n",length);
QueueEmpty(q); //判断队列是否为空

printf("队列元素依次为: ");
QueueTraverse(&q); //输出队列各个元素

GetHead(q,&h); //得到队头元素
printf("队头元素h = %d\n",h);

DeQueue(&q,&d);
printf("删除的队头元素d = %d\n",d);

GetHead(q,&h);
printf("队头元素h = %d\n",h);

ClearQueue(&q);
printf("清空队列后:q.front = %d q.rear = %d q.front->next = %d\n",q.front,q.rear,q.front->next);
DestoryQueue(&q);
printf("销毁队列后 q.front = %d q.rear = %d\n",q.front,q.rear);
return 0;
}

bool InitQueue(LinkQueue *q)//队列的初始化
{
q->front = (QueuePtr)malloc(sizeof(QNode));
if(q->front == NULL)
{
printf("内存分配失败 程序终止");
exit(-1);
}
q->rear = q->front;
q->front->next = NULL;
return true;
}

void QueueEmpty(LinkQueue q)//判断队列是否为空
{
if(q.front == q.rear)
printf("队列为空!\n");
else
printf("队列不为空!\n");
}

int QueueLength(LinkQueue q)//求队列长度
{
int i = 0;
QueuePtr p;
p = q.front;
while(q.rear != p)
{
i++;
p = p->next;
}
return i;
}

bool EnQueue(LinkQueue *q,int e)//插入元素e 为q的新的队尾元素
{
QueuePtr p;
p = (QueuePtr)malloc(sizeof(QNode));
if(p == NULL)
{
printf("内存分配失败,程序终止!\n");
exit(-1);
}
p->data = e;
p->next= NULL;
q->rear->next = p;
q->rear = p;
return true;
}

bool QueueTraverse(LinkQueue *q) //输出队列元素
{
QueuePtr p;
p = q->front->next;
while(p != NULL)
{
printf("%d  ",p->data);
p = p->next;
}
printf("\n");
return true;
}

bool GetHead(LinkQueue q,int *e) //输出队头元素
{
QueuePtr p;
if(q.front == q.rear)
return false;
p = q.front->next;
*e = p->data;
return true;
}

bool DeQueue(LinkQueue *q,int *e) //删除队头元素,并将队头元素赋给e
{
QueuePtr p;
if(q->front == q->rear)
return false;
p = q->front->next;
*e = p->data;
q->front->next = p->next;

if(q->rear == p)		 //一般情况下 删除队列头元素时仅需修改头结点中的指针
q->rear = q->front; //但当队列中最后一个元素被删除后 队列尾指针也丢失了,依次需要对队尾指针重新赋值(指向头结点)

free(p);
return true;
}

bool ClearQueue(LinkQueue *q) //清空队列
{
QueuePtr m, n;
q->rear = q->front;
m = q->front->next;
q->front->next = NULL;
while(m != NULL)
{
n = m;
m = m->next;
free(n);
}
return true;
}

bool DestoryQueue(LinkQueue *q) //销毁队列
{  //销毁时,无论空否,均可销毁
while(q->front)
{
q->rear = q->front->next;
free(q->front);
q->front = q->rear;
}
return true;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: