您的位置:首页 > 理论基础 > 数据结构算法

一步一步复习数据结构和算法基础-链式队列

2012-07-21 21:39 627 查看
真是无语,自己写好的队列的代码居然搁置了这么长的时间,拿出来晒一晒把:

#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;
}LinkQueue;

//基本操作
Status InitQueue(LinkQueue *Q);
Status DestroyQueue(LinkQueue *Q);
Status ClearQueue(LinkQueue *Q);
Status QueueEmpty(LinkQueue *Q);
Status QueueLength(LinkQueue *Q);
Status GetHead(LinkQueue *Q);
Status EnQueue(LinkQueue *Q,QElemType data);
Status DeQueue(LinkQueue *Q);
Status QueueTraverse(LinkQueue *Q);

//具体实现
Status InitQueue(LinkQueue *Q)
{
Q->front = Q->rear = (QueuePtr)malloc(sizeof(QNode));
if(! Q->front)exit(1);
Q->front->next = NULL;
return 1;
}

Status DestroyQueue(LinkQueue *Q)
{
while(Q->front)
{
Q->rear = Q->front->next;
free(Q->front);
Q->front = Q->rear;
}

return 1;
}

Status ClearQueue(LinkQueue *Q)
{
Q->front = Q->rear = NULL;

return 1;
}

Status QueueEmpty(LinkQueue *Q)
{
return ((Q->front == Q->rear)? 1:0);
}

Status QueueLength(LinkQueue *Q)
{
int flag=0;
QueuePtr temp = Q->front;
while(temp->next)
{
Q->rear = temp->next;
flag++;
temp = Q->rear;
}

return flag;
}

Status GetHead(LinkQueue *Q)
{
if(Q->front == Q->rear)
{
printf("Queue Handle Error.\n");
exit(1);
}
return Q->front->next->data;
}

Status EnQueue(LinkQueue *Q,QElemType data)
{
QueuePtr tmp;
tmp = (QueuePtr)malloc(sizeof(QNode));
tmp->data = data;
tmp->next = NULL;

Q->rear->next = tmp;
Q->rear = tmp;
return 1;
}

Status DeQueue(LinkQueue *Q)
{
QueuePtr temp;
if (Q->front == Q->rear)
{
printf("error.\n");
return 0;
}

temp = Q->front->next;
Q->front->next = temp->next;
if(Q->rear == temp)Q->rear = Q->front; //如果删除的是队列最后一个元素,要将队尾指针重新赋值
free(temp);
return 1;

}

Status QueueTraverse(LinkQueue *Q)
{
QueuePtr temp = Q->front;
if(Q->front == Q->rear)
{
printf("error!\n");
return 0;
}

while(temp->next)
{
Q->rear = temp->next;
printf("%d ",Q->rear->data);
temp = Q->rear;
}
printf("\n");
return 1;
}

int main()
{
QElemType number;
LinkQueue queue;
InitQueue(&queue);
while(scanf("%d",&number) != EOF)
{
EnQueue(&queue,number);
}
printf("当前该队列是 : %-6s\n",QueueEmpty(&queue) ? "空队列":"非空队列");
printf("当前队列长度为: %-6d\n",QueueLength(&queue));
printf("当前队头为: %-6d\n",GetHead(&queue));
printf("当前遍历队列的结果是:\n");
QueueTraverse(&queue);
DestroyQueue(&queue);
return 0;

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