C语言实现队列

时间:2022-11-06 17:39:52

队列的链式实现

    #include <stdio.h>  
#include <stdlib.h>
#include <stdbool.h>
#include <assert.h>
/*
队列的链式实现
*/
typedef int ElemType;
typedef struct Node{
ElemType elem;
struct Node *next;
}Node;//定义节点的结构体

typedef struct Queue{
Node *top;
Node *rear;
}Queue;//定义队列的结构体
void init(Queue *q);//初始化
void destroy(Queue *q);//销毁
bool isEmpty(Queue *q);//判断队列是否为空
void enqueue(Queue *q, ElemType elem);//入队
int dequeue(Queue *q);//出队
void traverse(Queue *q);//遍历
int main()
{
Queue *queue = NULL;
init(&queue);
enqueue(&queue,1);
enqueue(&queue,2);
enqueue(&queue,3);
enqueue(&queue,4);
enqueue(&queue,5);
traverse(&queue);
printf("\n");
printf("删除的元素为:%d\n",pop(&queue));
traverse(&queue);
destroy(&queue);
return 0;
}

void init(Queue *q){
q->top = (Node*)malloc(sizeof(Node));
if(q->top){
q->top->next = NULL;
q->rear = q->top;
}
}

void destroy(Queue *q){
Node *node = q->top->next;
while(node->next != NULL){
free(node);
node = node->next;
}
q->top = NULL;
q->rear = NULL;
}

bool isEmpty(Queue *q){
Node *node = q->top->next;
if(node == NULL){
return true;
}else{
return false;
}
}
/*
入队列:使用的是链表的尾插法的思想
1.设置尾节点,并将头节点赋值给尾节点
2.为需要插入的节点分配内存空间
3.将需要插入的数据赋值给新节点的值域
4.将新节点赋值给尾节点的下一个节点
5.将新节点赋值给尾节点
*/
void enqueue(Queue *q, ElemType elem){
Node *node = (Node*)malloc(sizeof(Node));
node->elem = elem;
node->next = NULL;
q->rear->next = node;
q->rear = node;
}
/*
出队列:使用的是链表的头删除思想
1.将需要删除的节点取出,赋值给一个临时变量
2.将需要删除的节点的下
一个节点赋值给需要删除的节点的上一个节点的下一个
3.free掉需要删除的节点即可
*/
int pop(Queue *q){
assert(!isEmpty(&q));
Node *new_node = q->top->next;
ElemType elem = new_node->elem;
q->top->next = new_node->next;
free(new_node);
return elem;
}

void traverse(Queue *q){
Node *node = q->top;
while(node->next != NULL){
printf("%d ",node->next->elem);
node = node->next;
}
}