数据结构--链队列

时间:2022-06-22 10:23:57

课程实验,多有不足


#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#define TRUE       1
#define FALSE      0
#define OK         1
#define ERROR      0
typedef int QueueElementType;

typedef struct Node
{
QueueElementType data;     /*数据域*/
struct Node *next;     /*指针域*/
}LinkQueueNode;
typedef struct
{
LinkQueueNode *front;
LinkQueueNode *rear;
}LinkQueue;
/*初始化操作。*/
int InitQueue(LinkQueue *Q)
{
/* 将Q初始化为一个空的链队列 */
Q->front=(LinkQueueNode *)malloc(sizeof(LinkQueueNode));
if(Q->front!=NULL)
{
  Q->rear=Q->front;
  Q->front->next=NULL;
   return(TRUE);
}
else return(FALSE);    /* 溢出!*/
}
/*入队操作。*/
int EnterQueue(LinkQueue *Q,QueueElementType x)
{
/* 将数据元素x插入到队列Q中 */
LinkQueueNode *NewNode;
NewNode=(LinkQueueNode *)malloc(sizeof(LinkQueueNode));
if(NewNode!=NULL)
{
  NewNode->data=x;
  NewNode->next=NULL;
  Q->rear->next=NewNode;
  Q->rear=NewNode;
  return(TRUE);
}
else return(FALSE);
//请完成本函数的功能
}
/*出队操作。*/
int DeleteQueue(LinkQueue *Q,QueueElementType *x)
{
/* 将队列Q的队头元素出队,并存放到x所指的存储空间中 */
LinkQueueNode *p;
if(Q->front==Q->rear)
  return(FALSE);
p=Q->front->next;
Q->front->next=p->next;
if(Q->rear==p)
  Q->rear=Q->front;
*x=p->data;
free(p);
return(TRUE);
//请完成本函数的功能
}
int GetHead(LinkQueue *Q, QueueElementType *x)
{
/*提取队列的队头元素,用x返回其值*/
if(Q->front==NULL)
  return(FALSE);
else
{
  *x=Q->front->data;
  return(TRUE);
}
//请完成本函数的功能*/
}

int DestroyLinkQueue(LinkQueue *Q)
{//销毁一个队列
QueueElementType e;
while(Q->front!=Q->rear)
  DeleteQueue(Q,&e);
free(Q->front);
Q->front=Q->rear=NULL;
return OK;
}
int LinkQueueLength(LinkQueue *Q)
{//队列的长度
int i=0;
LinkQueueNode * p=Q->front;
while(p!=Q->rear){
  ++i;
  p=p->next;
}
return i;
}
int DisplayLinkQueue(LinkQueue *Q)
{//显示队列中所有元素
LinkQueueNode * p;
int i=0;
p=Q->front->next;
if(p==NULL) printf("队列为空!\n");//队列为空
else{
  while(p){       //否则显示队列中所有元素
   printf("[%d:%d]",++i,p->data);
   p=p->next;
  }
  printf("\n");
}
return OK;
}
void main(){
LinkQueue LQ;
QueueElementType e;
int flag=1,ch,len;
int temp;
printf("本程序实现链式结构队列的操作。\n");
printf("可以进行入队列、出队列等操作。\n");
InitQueue(&LQ);       //初始化队列
while(flag){
  printf("请选择:\n");
  printf("1.显示队列所有元素\n");
  printf("2.入队列\n");
  printf("3.出队列\n");
  printf("4.求队列的长度\n");
  printf("5.退出程序\n");
  scanf("%d",&ch);
  switch(ch){
  case 1:DisplayLinkQueue(&LQ);   //显示队列中所有元素
   break;
  case 2:printf("请输入要人队的元素(一个整数):");
   scanf("%d",&e);   //输入要入队列的字符
   EnterQueue(&LQ,e);//入队列
   DisplayLinkQueue(&LQ);
   break;
  case 3:temp=DeleteQueue(&LQ,&e);  //出队列
   if(temp==TRUE){
    printf("出队一个元素:%d\n",e);
    DisplayLinkQueue(&LQ);
   }
   else printf("队列为空!\n");
   break;
  case 4:len=LinkQueueLength(&LQ);
   printf("队列的长度为:%d\n",len);
   break;
  default:flag=0;
   printf("程序运行结束,按任意键退出!\n");
   getcher();
  }
}
DestroyLinkQueue(&LQ);
}