0
点赞
收藏
分享

微信扫一扫

数据结构——链队的基本操作(包含入队、出队、求长度、取队头、清除等)

芷兮离离 2022-03-30 阅读 48

定义和结构

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<algorithm>

#define MAXSIZE 100
#define ElemType int
#define Status int
enum TF{ERROR,OK};

using namespace std;

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

typedef struct
{
QueuePtr front; //队头指针
QueuePtr rear;
}LinkQueue;

初始化

Status InitQueue(LinkQueue &Q)
{
Q.front=Q.rear=new QNode; //生成节点为头节点,队头队尾指针指向该节点,(该节点为空节点)
Q.front->next=NULL;
return OK; //头节点指针域置空
}

销毁队列和清空队列(不太清楚有什么区别就码一样了)

Status DestroyQueue(LinkQueue &Q)
{
if(Q.front==Q.rear) //队列是否为空条件
{
printf("队空!\n");
return ERROR;
}
Q.front=Q.rear;
printf("队列已销毁!\n");
return OK;

}

Status ClearQueue(LinkQueue &Q)
{
if(Q.front==Q.rear) //队列是否为空条件
{
printf("队空!\n");
return ERROR;
}
Q.front=Q.rear;
printf("队列已清空!\n");
return OK;

}

判断队空

bool QueueEmpty(LinkQueue Q)
{
if(Q.front==Q.rear) return true;
return false;
}

求队列长度

int QueueLength(LinkQueue Q)   //有问题
//躺了,直接用循环求
{
int i=0;
QNode *p=Q.front->next;
while(p)
{
i++;
p=p->next;
}
return i;
}

入队

Status EnQueue(LinkQueue &Q,ElemType e)
{
QNode *p=new QNode;
p->data=e;
p->next=NULL;

Q.rear->next=p;
Q.rear=p;
return OK;
}

出队

Status DeQueue(LinkQueue &Q,ElemType &e)
{
if(Q.front==Q.rear)
{
printf("队空!\n");
return ERROR;
}
QNode *p;
p=Q.front->next;
e=p->data;
Q.front->next=p->next;

//重头
if(Q.rear==p) //删除的是队列的最后一个节点
{
Q.rear=Q.front;
}
return OK;
}

取对头元素

Status GetHead(LinkQueue Q,ElemType &e)
{
if(Q.front==Q.rear)
{
printf("队空!\n");
exit(0); //直接停止
}
e=Q.front->next->data;
return OK;
}

遍历元素/打印元素

Status QueueTraverse(LinkQueue &Q)
{
if(Q.front==Q.rear)
{
printf("队空!\n");
exit(0);
}
printf("队列元素:");
QNode *p=Q.front->next;
while(p)//while(p!=Q.rear)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
return OK;
}

void Print(LinkQueue Q)
{
if(Q.front==Q.rear)
{
printf("队空!\n");
}

QNode *p=Q.front->next;
//也可以p=new QNode; p=Q.front->next; 只是创建的那个新节点不被利用,浪费了一块空间
while(p)//while(p!=Q.rear->next)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}

菜单

void menu()
{
printf("********1.入队 2.出队*********\n");
printf("********3.取队顶 4.清空队*******\n");
printf("********5.遍历 6.销毁*********
\n");
printf("**
******7.队长度 8.退出*********\n");
}

以下为功能函数

void enqueue(LinkQueue &Q)
{
int n;
ElemType e;
int flag;
printf("请输入入队元素个数(>=1):");
scanf("%d",
for(int i=0;i<n;i++)
{
printf("请输入第%d个元素的值:",i+1);
scanf("%d",
flag=EnQueue(Q,e);
if(flag)printf("%d已入队\n",e);
}
printf("当前队列元素为:");
Print(Q);
}

void dequeue(LinkQueue &Q)
{
ElemType e;
if(DeQueue(Q,e))
{
printf("出队元素为:%d\n",e);
printf("剩余元素为:");
Print(Q);
}
}

void gethead(LinkQueue &Q)
{
ElemType e;
if(GetHead(Q,e))
{
printf("队顶元素为:%d\n",e);
printf("队列元素为:");
Print(Q);

}
}

void queuelength(LinkQueue &Q)
{
printf("队的长度为:%d\n",QueueLength(Q));
printf("此时队的元素:");
Print(Q);
}

主函数

int main()
{
LinkQueue Q;
InitQueue(Q);
int choice;
while(1)
{
menu();
printf("请输入菜单号:");
scanf("%d",
if(choice==8) break;
switch(choice)
{
case 1:enqueue(Q);break;
case 2:dequeue(Q);break;
case 3:gethead(Q);break;
case 4:ClearQueue(Q);break;
case 5:QueueTraverse(Q);break;
case 6:DestroyQueue(Q);break;
case 7:queuelength(Q);break;
default:printf("输入错误!");
}
}
return 0;
}


运行截图

 

 

举报

相关推荐

0 条评论