栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

定义和结构

#include
#include
#include
#include
#include
#include

#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 

主函数

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;
}


运行截图

 

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/780293.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号