链队的基本操作
1、分配空间初始化
2、入队
3、出队
4、判断队是否为空
5,清空队
6,销毁队
7、遍历队
8,取对头
9、获取队的长度
用开关语句来控制程序的功能选择
//链队
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
typedef int Status;
typedef char QElenType;
typedef struct QLNode
{
QElenType data;
struct QLNode *next;
}QLNode,*QueuePtr;
typedef struct
{
QLNode *front;
QLNode *rear;
}LinkQueue;
Status InitLink_Q(LinkQueue *Q)
{
Q->front=Q->rear=(QueuePtr)malloc(sizeof(QLNode));
if(!Q->front) exit(0);
Q->front->next=NULL;
Q->rear->next=NULL;
return OK;
}
//入队
Status CreatLink_Q(LinkQueue *Q)
{
QElenType e;
QLNode *s;
int i=0,length;
if(!Q->front) return ERROR;
printf("请输入要入队多少个元素:");
scanf("%d",&length);
for(i=0;i<length;i++)
{
fflush(stdin);
scanf("%c",&e);
s=(QueuePtr)malloc(sizeof(QLNode));
s->data=e;
s->next=Q->rear->next;
Q->rear->next=s;
Q->rear=s;
}
return OK;
}
//出队
Status GetQueue(LinkQueue *Q)
{
QElenType e;
if(!Q->front) return ERROR;
while(Q->front->next!=NULL)
{
Q->rear=Q->front->next;
e=Q->rear->data;
Q->front->next=Q->rear->next;
free(Q->rear);
printf("%c ",e);
}
Q->rear=Q->front;
return OK;
}
//判队是否为空
void L_QueueEmp(LinkQueue *Q)
{
if(Q->front->next==NULL) printf("队为空!\n");
else
printf("队不为空!\n");
}
//清空
Status Clear_Q(LinkQueue *Q)
{
QLNode *p;
if(Q->front->next==NULL) printf("队为空!\n");
else
{while(Q->front->next!=NULL)
{
Q->rear=Q->front->next;
Q->front->next=Q->rear->next;
free(Q->rear);
}
Q->rear=Q->front;
return OK;}
}
//销毁
Status Destroy_Q(LinkQueue *Q)
{
if(Q->front->next==NULL) free(Q->front);
while(Q->front!=NULL)
{
Q->rear=Q->front->next;
free(Q->front);
Q->front=Q->rear;
}
free(Q->front);
return OK;
}
//遍历
Status Trever_Q(LinkQueue *Q)
{
QLNode *p;
QElenType e;
if(Q->front==Q->rear) return 0; //
p=Q->front->next;
while(p!=NULL)
{
e=p->data;
p=p->next;
printf("%c ",e);
}
return OK;
}
//获取头
void Get_Head(LinkQueue *Q)
{
QElenType e;
if(Q->front->next==NULL) exit(0);
Q->front=Q->front->next;
e=Q->front->data;
printf("对头元素为:%d\n",e);
}
//长度
Status Q_length(LinkQueue *Q)
{
QLNode *p;
int k=0;
p=Q->front;
while(p->next!=NULL)
{
p=p->next;
k++;
}
return k;
}
void Desktop()
{
printf("***********************\n");
printf("1、初始化建立队\t\t2、元素入队\n3、元素出队\t\t4、判断队是否为空\n5、清空队\t\t6、销毁队\n7、遍历队\t\t8、获取对头元素\n9、获取队长度\t\t10、清屏\n0、退出\n");
printf("***********************\n");
}
int main()
{
int i,j,select;
LinkQueue Q;
Desktop();
while(1)
{
printf("请输入选择:");
scanf("%d",&select);
if(select==0) break;
switch(select)
{
case 1://1、初始化建立队
{
i=InitLink_Q(&Q);
if(i==1) printf("初始化成功!\n");
}break;
case 2://2、元素入队
{
i=CreatLink_Q(&Q);
if(i==i) printf("入队成功!\n");
}break;
case 3://3、元素出队
{
i=GetQueue(&Q);
if(i==1) printf("出队成功!\n");
}break;
case 4://4、判断队是否为空
{
L_QueueEmp(&Q);
}break;
case 5://5、清空队
{
i=Clear_Q(&Q);
if(i==1) printf("清空成功!\n");
}break;
case 6://6、销毁队
{
i=Destroy_Q(&Q);
if(i==1) printf("销毁成功!\n");
}break;
case 7://7、遍历队
{
i=Trever_Q(&Q);
if(i==1) printf("遍历完成!\n");
}break;
case 8://8、获取对头元素
{
Get_Head(&Q);
}break;
case 9://9、获取队长度
{
i=Q_length(&Q);
printf("队的长度为:%d\n",i);
}break;
case 10:
{
system("cls");
Desktop();
}break;
}
}
system("pause");
}