0
点赞
收藏
分享

微信扫一扫

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

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

定义和结构

#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",&n);
	for(int i=0;i<n;i++)
	{
	 printf("请输入第%d个元素的值:",i+1);
	 scanf("%d",&e);
	 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",&choice);
        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 条评论