链式队列的实现

来源:互联网 发布:淘宝客昵称怎么修改 编辑:程序博客网 时间:2024/06/05 16:15

// 链式队列--定义控制台应用程序的入口点。

//数据结构之链式队列的基本实现


#include<stdio.h>
#include<stdlib.h>

typedef void Status;


typedef struct List
{
int data;
struct List *next;
}SList;


typedef struct
{
SList *front;
SList * rear;
}LiQueue;






Status InitQueue(LiQueue *Q)//初始化空队列
{
Q->front = Q->rear = (SList*)malloc(sizeof(LiQueue));//生成头结点
if (!Q->front)
{
printf("分配失败!!");
//exit(1);
}
Q->front->next = NULL;//头结点的next域为空
printf("=======================\n");
printf("***初始化完成***\n");
printf("=======================\n\n");
}


Status isEmptyQueue(LiQueue *Q)//判断队列是否为空
{
if (Q->front == Q->rear)
{
printf("**队为空**\n");
}
else
{
printf("**队非空**\n");
}
}


Status EnQueue(LiQueue *Q)//进队列
{
SList *p;
int x = NULL;
char c = NULL;


p = (SList*)malloc(sizeof(SList));//先申请新结点空间
if (p == NULL)
{
printf("分配新空间失败!!");


}
printf("请输入数据,以回车结束:\n");
while (c != '\n')
{


scanf("%d", &x);
c = getchar();
p->data = x; //把x赋值到分配的新节点上
p->next = NULL;
Q->rear->next = p;//原来的尾巴指向新结点
Q->rear = p; //尾指针指向新结点


p = (SList*)malloc(sizeof(SList));//申请新结点空间
}
printf("**入队操作完成**\n");
printf("=================\n");


}


Status Display(LiQueue *Q)//打印队中元素
{
SList *p = Q->front->next;
if (Q->front == Q->rear)
{
printf("队列为空,不能进行打印");
}
printf("队中元素如下:\n");
while (p != NULL)
{
printf("%d \n", p->data);
p = p->next;
}
}




Status OutQueue(LiQueue*Q)//元素出队
{
SList *p = NULL;
int e;
if (Q->front == Q->rear)
{
printf("队列为空,不能操作删除!!");
}
while (Q->front->next != NULL)
{
p = Q->front->next;//p指向头结点
e = p->data;


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


if (Q->rear == p)
{
Q->rear = Q->front;
}
free(p);
}


return;
}




Status GetHead(LiQueue*Q)//获取队头元素
{
int e;
if (Q->front == Q->rear)
{
printf("队列为空,不能取队头元素!!");


}
else
{
e = Q->front->next->data;
printf("队头元素为:%d\n", e);
}


}




Status FShow(LiQueue *q)
{
int flag = NULL;
printf("\t*********\n");
printf("\t1:初始化\n");
printf("\t2:判断\n");
printf("\t3:入队\n");
printf("\t4:打印\n");
printf("\t5:出队\n");
printf("\t6:队头\n");
printf("\t0:退出\n");


while (true)
{
printf("请输入相应序号进行操作:\n");
scanf("%d", &flag);
switch (flag)
{
case 1:InitQueue(q);
break;
case 2:isEmptyQueue(q);
break;
case 3:EnQueue(q);
break;
case 4:Display(q);
break;
case 5:OutQueue(q);
break;
case 6:GetHead(q);
break;
case 0:exit(1);
break;
default:printf("输入有误,请检查");
break;
}
}
}
Status Show()
{
LiQueue p;
FShow(&p);
}
int main()
{
Show();
return 0;
}



1 0
原创粉丝点击