当前位置: 首页 > wzjs >正文

网站制图软件京挑客网站怎么做

网站制图软件,京挑客网站怎么做,商场设计费,网页设计教程谁的好目录 前言 一、队列的概念及其结构 二、实现 2.1结构体定义 2.2初始化 2.3销毁链表 2.4尾插入(入队) 2.5头删(出队) 2.6个数 2.7检验是否为空 2.8取队头数据 2.9取队尾数据 三、检验 总结 前言 本文介绍队列&#x…

目录

前言

一、队列的概念及其结构

二、实现

 2.1结构体定义

2.2初始化

2.3销毁链表

2.4尾插入(入队)

2.5头删(出队)

2.6个数

2.7检验是否为空

2.8取队头数据

2.9取队尾数据

三、检验

总结


前言

本文介绍队列,以及实现的代码。


一、队列的概念及其结构

相对于栈来说,队列跟栈就是相反的。

队列只允许在一端插入数据,在另一端进行删除数据操作的特殊线性表,队列具有先进先出的特性。(First In First Out,FIFO),队列常用于实现缓冲区、任务调度等场景。

入队列:进行插入操作的一端称为队尾

出队列:进行删除操作的一端称为队头

下面是一个简单的图形,方便理解:

这里如果实现链表的话,使用一个单链表就可以,使用数组的话不方便。

二、实现

这里要实现的功能有:

void QueueInit(Queue* pq);//初始化
void QueueDestroy(Queue* pq);//删除销毁
void QueuePush(Queue* pq, QDatatype x);//尾插入
void QueuePop(Queue* pq);//头删
void QueueSize(Queue* pq);//个数
bool QueueEmpty(Queue* pq);//检验是否为空
QDatatype QueueFront(Queue* pq);//队头数据
QDatatype QueueBack(Queue* pq);//队尾数据

 2.1结构体定义

结构体定义,因为使用的是单链表,所以也就是定义一个单链表的结构体节点:

typedef int QDatatype;//数据类型typedef struct QueueNode
{struct QueueNode* Next;//节点QDatatype data;//数据
}QNode;

因为队列的定义是先进先出,队尾进,队头出,所以我们要实现这个功能,需要链表的头和尾,这里为了传入参数的方便,用另一个结构体封装一下头尾指针,传参只需要传这个结构体就可以获取头尾指针了。

typedef struct Queue
{QNode* head;//头指针QNode* tail;//尾指针
}Queue;

2.2初始化

初始化只需要初始化这个结构体就可以,因为我们后期需要节点结构体往这里创建连接节点,从而实现head和tail的移动,方便后期的使用。

void QueueInit(Queue* pq)//初始化
{assert(pq);pq->head =pq->tail = NULL;pq->size = 0;
}

此时,pq这个实例头尾指针因为没有指向,所以初始化给NULL(当然也避免野指针的问题),然后里面的节点数量给0,这样就实现了一个带头尾指针单链表的初始化。

2.3销毁链表

销毁链表,需要把链表中每一个节点都销毁掉,否则出现了内存泄漏。

void QueueDestroy(Queue* pq)//删除销毁
{assert(pq);QNode* cur = pq->head;while (cur){QNode* next = cur->next;free(cur);cur = next;}pq->head = pq->tail = NULL;pq->size = 0;
}

首先可以检查一下链表中是否有数据,这里通过一个遍历,把链表中的每一个节点free掉,最后回到初始化状态。当循环结束,也就是把里面的节点全部free了。

2.4尾插入(入队)

尾插就是链表的尾插,只不过这里加入了头尾指针的问题。

依旧是首先要malloc一个空间用来存放节点,检验一下节点是否创建成功,如果没成功就输出错误信息并结束,如果成功了,就把x传入data。

void QueuePush(Queue* pq, QDatatype x)//尾插入
{QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL){perror("malloc fail");return;}newnode->data = x;//newnode->next=NULL;if (pq->head == NULL){assert(pq->tail == NULL);pq->head = pq->tail = newnode;}else{pq->tail->next = newnode;pq->tail = newnode;}pq->tail->next = NULL;pq->size++;
}

然后判断head和tail是否都为null,如果都为null,就代表里面没有节点,就直接把newnode赋给tail和head就可以,接下来,如果里面有节点了,就把新newnode赋给tail(尾节点)的下一个,然后更新tail的指针,最后把tail的下一个赋为空,防止内存泄漏(避免next为野指针),这里需要留意,然后把size++,更新一下里面数据节点的数量。

2.5头删(出队)

这里了进行分开判断,首先对节点和实例进行了检验,然后通过判断是否是一个节点还是多个节点进行分开判断,如果多个节点就按照else里的处理,如果只有一个节点就可以直接删除此节点,最后size--,把数量更新一下。

void QueuePop(Queue* pq)//头删
{assert(pq);assert(pq->head!=NULL);if (pq->head == pq->tail){free(pq->head);pq->head = pq->tail = NULL;}else{QNode* cur = pq->head->next;free(pq->head);pq->head = cur;}pq->size--;
}

2.6个数

这里之前定义的size就有用了,我们可以直接返回size就可以了。

void QueueSize(Queue* pq)//个数
{assert(pq);printf("个数:%d\n", pq->size);
}

2.7检验是否为空

检验是否为空也就是检验size是否为0。

bool QueueEmpty(Queue* pq)//检验是否为空
{assert(pq);return pq->size == 0;
}

2.8取队头数据

QDatatype QueueFront(Queue* pq)//队头数据
{assert(pq);assert(!QueueEmpty(pq));return pq->head->data;
}

2.9取队尾数据

QDatatype QueueBack(Queue* pq)//队尾数据
{assert(pq);assert(!QueueEmpty(pq));return pq->tail->data;
}

三、检验

我们可以通过一个test.c文件来验证一下刚才写的函数,也可以帮助理解。

#include"Queue.h"
int main()
{Queue st;QueueInit(&st);QueuePush(&st, 1);QueuePush(&st, 2);QueuePush(&st, 3);QueuePush(&st, 4);QueuePush(&st, 5);QueueSize(&st);QueuePop(&st);QueuePop(&st);QueueSize(&st);//打印输出while(!QueueEmpty(&st)){printf("%d ", QueueFront(&st));QueuePop(&st);}printf("\n");QueueDestroy(&st);//销毁return 0;
}

道爷我成了!

当然这里只是基本的东西,有很多地方可以改善和添加功能,这里只对简单的队列进行原理的学习。


总结

队列是一种先进先出(FIFO)的数据结构,常用于实现缓冲区、任务调度等场景。队列的基本操作包括初始化、销毁、入队、出队、获取队列大小、检验队列是否为空以及获取队头和队尾元素。

队列的实现可以通过链表或数组来完成,本文介绍了使用单链表实现队列的基本操作。在实现过程中,需要定义队列节点结构体以及队列结构体,同时实现各种操作函数来对队列进行操作。

通过编写测试代码,可以验证队列的各项功能是否正常运行,帮助加深对队列数据结构的理解。

http://www.dtcms.com/wzjs/587990.html

相关文章:

  • 新手做网站视频讲解使页面具有动态效果的网站建设技术
  • 网站开发浏览器兼容性58同城网站建设 推广
  • 英文网站建设600中信建设有限责任公司湖南省人防设计院
  • 哪家做的濮阳网站建设模板网站建设制作
  • 如何做阿语垂直网站分类目录网站做谷歌联盟
  • 网站建设 教学视频嵌入式软件开发招聘
  • 芜湖做网站的邓健照片广东东莞属于哪个市
  • 在什么网站可以接设计做as3 xml 网站模板 下载
  • 建设网站能赚钱网站建设服务公司
  • 网站申请页面中文wordpress主题
  • 山东自助seo建站angularjs 网站模板
  • 小企业网站推广wordpress安装 用户名已存在
  • 可以看国外网站的浏览app安全的小网站
  • 河源市建设网站wordpress多个置顶
  • 合肥市建设工程信息价网站wordpress侧栏菜单
  • 做网站要用服务器吗建网站要多少钱 东莞
  • ps外包网站开电商网站需要多少钱
  • 被墙网站怎么做301跳转先用ps后用dw做网站
  • 营销网站建设的规则网站被挂黑链
  • 怎么查网站注册信息有没有做文创的网站
  • 怎么才能注册做网站中国污水处理工程网
  • 西部建设网站wordpress下载类型主题
  • 长沙网站设计中江建设局网站
  • 怎么做网站文章优化网页美工怎么做
  • 可以建网站的平台常州建设工程信息网
  • 建一个pc网站需要多少钱公司网站建设工作室
  • 成都网站建设六六小红书手工
  • 上海做网站多少钱温州建站软件
  • 中国建设银行网站个人客户官网做网站需要的技术 规范
  • 做类似淘宝的网站设计需要什么品牌网站设计网站