队列的实现(链表)
队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out)。
入队列: 进行插入操作的一端称为队尾。
出队列: 进行删除操作的一端称为队头。
队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低。
#include <stdio.h>
#include <assert.h>
#include <stdbool.h>
typedef int QDataType;
typedef struct QueueNode
{
QDataType data;
struct QueueNode *next;
}QueueList;
void QueueInit(QueueList **head);
void QueueDestory(QueueList *head);
QueueList *QueuePush(QueueList *head, QDataType data);
bool QueueEmpty(QueueList *head);
void QueuePop(QueueList **head);
QDataType QueueBack(QueueList *head);
QDataType QueueFront(QueueList *head);
size_t QueueSize(QueueList *head);
void QueuePrint(QueueList *head);
int main()
{
QueueList *head;
QueueInit(&head);
QueuePrint(head);
for(int i = 0; i < 4; i++)
{
head = QueuePush(head, i);
}
QueuePrint(head);
head = QueuePush(head, 89);
printf("89入栈:\n");
QueuePrint(head);
printf("出栈:\n");
QueuePop(&head);
QueuePrint(head);
printf("栈头数据:%d\n", QueueFront(head));
printf("栈尾数据:%d\n", QueueBack(head));
printf("栈大小:%d\n", QueueSize(head));
return 0;
}
//队列初始化
void QueueInit(QueueList **head)
{
// *head = (QueueList *)malloc(sizeof(QueueList));
*head = NULL;
}
//队列的销毁
void QueueDestory(QueueList *head)
{
if(head == NULL)
{
return ;
}
QueueList *tmp = head;
while(tmp)
{
QueueList *mmp = tmp->next;
free(tmp);
tmp = mmp;
}
}
//进队列
QueueList *QueuePush(QueueList *head, QDataType data)
{
// assert(head);
QueueList *newnode = (QueueList *)malloc(sizeof(QueueList));
if(newnode == NULL)
{
printf("开辟空间失败!");
exit(-1);
}
newnode->data = data;
newnode->next = NULL;
if(head == NULL)
{
head = newnode;
}
else
{
QueueList *tmp = head;
while(tmp->next != NULL)
{
tmp = tmp->next;
}
tmp->next =newnode;
}
return head;
}
//出队列
void QueuePop(QueueList **head)
{
assert(*head);
assert(!QueueEmpty(*head)); //head是否为空
QueueList *tmp = *head;
(*head) = (*head)->next;
free(tmp);
}
//队列是否为空
bool QueueEmpty(QueueList *head)
{
assert(head);
return head == NULL;
}
//获取头数据
QDataType QueueFront(QueueList *head)
{
assert(head);
assert(!QueueEmpty(head)); //head是否为空
return head->data;
}
//获取尾数据
QDataType QueueBack(QueueList *head)
{
assert(head);
assert(!QueueEmpty(head)); //head是否为空
QueueList *tmp = head;
while(tmp->next != NULL)
{
tmp = tmp->next;
}
return tmp->data;
}
//获取队列的长度
size_t QueueSize(QueueList *head)
{
assert(head);
assert(!QueueEmpty(head)); //head是否为空
QueueList *tmp = head;
size_t cnt = 0;
while(tmp != NULL)
{
cnt++;
tmp = tmp->next;
}
return cnt;
}
//队列的打印
void QueuePrint(QueueList *head)
{
for(QueueList *p = head; p != NULL; p = p->next)
{
printf("%d %#X \n", p->data, p);
}
}