首页 > 其他分享 >【数据结构】队列的定义以及C语言代码的实现(仅供学习交流使用)

【数据结构】队列的定义以及C语言代码的实现(仅供学习交流使用)

时间:2022-10-16 21:34:10浏览次数:48  
标签:head pq 队列 C语言 Queue next tail 数据结构

1、队列的定义

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out)

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

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

【数据结构】队列的定义以及C语言代码的实现(仅供学习交流使用)_初始化

2、队列的实现

        用单链表的形式去实现,非常的合适,只要找到一个头结点当队头,一个尾结点当队尾,然后依次实现头删,尾插即可

typedef int QDtatType;
typedef struct QueueNode
{
struct QuedeNode*next;
QDtatType data;
}QNode;
typedef struct Queue
{
QNode*head;
QNode*tail;
}Queue;

3、队列的接口函数

实现如下的接口函数

void QueueInit(Queue*pq);//初始化队列
void QueueDestory(Queue*pq);//摧毁队列
void QueuePush(Queue*pq, QDtatType x);//队尾入
void QueuePop(Queue*pq);//队头出
//取队头队尾的数据
QDtatType QueueFront(Queue*pq);
QDtatType QueueBack(Queue*pq);
int QueueSize(Queue*pq);//取数据的个数
bool QueueEmpty(Queue*pq);//判断队列是否为空

(1)初始化队列

void QueueInit(Queue*pq)//
{
assert(pq);
pq->head = NULL;
pq->tail = NULL;
}

(2)摧毁队列

void QueueDestory(Queue*pq)
{
assert(pq);
QNode*cur = pq->head;
while (cur != NULL)
{
QNode*next = cur->next;//先把下一个保存了
free(cur);
cur = next;

}
pq->head = pq->tail = NULL;
}

(3)队尾入

void QueuePush(Queue*pq, QDtatType x)//队尾入
{
assert(pq);
QNode*newnode = (QNode*)malloc(sizeof(QNode));//先弄一个新的节点出来;
if (newnode == NULL)
{
printf("malloc fail");
exit(-1);
}
newnode->data = x;
newnode->next = NULL;
if (pq->tail == NULL)
{
pq->head = newnode;
pq->tail = newnode;
}
else
{
pq->tail->next = newnode;
pq->tail = pq->tail->next;
}
}

(4)队头出

void QueuePop(Queue*pq)//队头出
{
assert(pq);
assert(pq->head);
if (pq->head->next == NULL)//这里的目的是为了防止队列只有一个节点的时候,出现tail野指针的情况
{
free(pq->head);
pq->head = pq->tail = NULL;
}
else//多个节点的情况
{
//先保存下一个
QNode*next = pq->head->next;
free(pq->head);
pq->head = next;
}

}

(5)取队头队尾的数据

QDtatType QueueFront(Queue*pq)
{
assert(pq);
assert(pq->head);
return pq->head->data;
}
QDtatType QueueBack(Queue*pq)
{
assert(pq);
assert(pq->head);
return pq->tail->data;
}

(6)队列中数据的个数

int QueueSize(Queue*pq)//取数据的个数
{
assert(pq);
int size = 0;
QNode*cur = pq->head;
while (cur)
{
++size;
cur = cur->next;
}
return size;
}

(7)判断队列是否为空

bool QueueEmpty(Queue*pq)//判断队列是否为空
{
assert(pq);
return pq->head == NULL;//等于空则真,不等于空则假
}


标签:head,pq,队列,C语言,Queue,next,tail,数据结构
From: https://blog.51cto.com/u_15100472/5760543

相关文章

  • Redis数据结构之字符串
    目录Redis数据结构之字符串添加获取修改删除判断一个key是否存在查看过期时间设置过期时间合并set和ex合并set和px判断一个key是否存在,存在则忽略,不存在则创建合并set和nx......
  • Redis数据结构之列表
    目录Redis数据结构之列表查看命令帮助创建列表从左边插入元素从右边插入数据若list存在,则从左边依次追加元素,不存在则忽略若list存在,则从右边依次追加元素,不存在则忽略从li......
  • Redis数据结构之哈希
    目录Redis数据结构之哈希写入获取数据修改数据删除数据删除所有数据查看key中指定的field是否存在若value中没有相应的field,则创建获取多个值获取所有的key和value获取所......
  • 【数据结构】栈的定义以及接口函数的C语言代码实现(仅供学习交流使用)
    1、栈的定义栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last......
  • 【数据结构】二叉树的概念和简单实现(仅供学习交流使用)
    1、树1、树的概念   树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝......
  • 【以练促学】(数据结构)1.绪论篇
    (持续刷题持续更新...) 1.数据结构的三要素:逻辑结构、物理结构、数据运算 eg.以下属于逻辑结构的( )A.顺序表   B.哈希表   C.有序表  D.单链......
  • 04 队列 | 数据结构与算法
    1.队列1.队列的概念队列:操作受限的线性表,只允许在一端进行元素的插入,另一端进行元素的删除空队列:不含有任何元素的队列队头和队尾:进行删除的一端叫队头front,进行插......
  • C语言入门1
    C语言初级阶段常量与变量1.常量:不能被改变的量,ex:1、2、3(1)整型常量:整数(2)实型常量:①十进制小数形式:数字和小数点组成②指数形式:12.34e3=10.34*103(3)字符常量:ex:’a'、......
  • 【C语言】操作数的优先级大小。
    ......
  • C语言实例2
    题目:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,提成7.5%;利润20万到4......