链式队列的思想是尾插法,先进先出。
1、首先我们需要一个头节点
//创建一个结构体表示节点
typedef struct node_s {
int data;
struct node_s* next;
}que;
//创建头节点
que* creat_head_node() {
que* head = (que*)malloc(sizeof(que));
head->next = NULL;
memset(head, 0, sizeof(que));
return head;
2、然后我们在进队列(添加新节点)需要一个尾指针rear,尾指针永远指向队列的最后一个元素(节点),所以进来的时候:rear->next = new_node;rear = new_node,以便下一个元素进队之前尾指针是指向最后一个元素的
que* add_que(que* rear, int data) {
que* new_node = (que*)malloc(sizeof(que));
new_node->data = data;
new_node->next = NULL;
//使用尾插法向链队列中添加数据元素
rear->next = new_node;
rear = new_node;
return rear;
3、出队列(删除节点)的时候,需要一个头指针top,头指针永远指向头节点,在出队列的时候,通过top->next指向头节点后边的那个节点,这个节点就是即将出队的节点创建一个新指针指向它,p = head->next,因为它要出去,所有要断开它的所有连接,既让头节点指向它的下一个节点,p->next = top->next。
que* de_que(que* top, que* rear) {
if (top->next == NULL) {
printf("\n");
printf("出队完成");
return rear;
}
que* p = top->next;
printf("%d ", p->data);
top->next = p->next;
if (rear == p) {
rear = top;
}
return rear;
所以实现链式队列就三个步骤,逻辑理清楚之后就很容易理解了。
以下是全部代码
#include <stdio.h>
#include <stdlib.h>
typedef struct node_s {
int data;
struct node_s* next;
}que;
que* creat_head_node() {
que* head = (que*)malloc(sizeof(que));
head->next = NULL;
memset(head, 0, sizeof(que));
return head;
}
que* add_que(que* rear, int data) {
que* new_node = (que*)malloc(sizeof(que));
new_node->data = data;
new_node->next = NULL;
//使用尾插法向链队列中添加数据元素
rear->next = new_node;
rear = new_node;
return rear;
}
que* de_que(que* top, que* rear) {
if (top->next == NULL) {
printf("\n");
printf("出队完成");
return rear;
}
que* p = top->next;
printf("%d ", p->data);
top->next = p->next;
if (rear == p) {
rear = top;
}
return rear;
}
int main() {
que* queue, * top, * rear;
queue = top = rear = creat_head_node();//创建头结点
//向链队列中添加结点,使用尾插法添加的同时,队尾指针需要指向链表的最后一个元素
rear = add_que(rear, 1);
rear = add_que(rear, 2);
rear = add_que(rear, 3);
rear = add_que(rear, 4);
//入队完成,所有数据元素开始出队列
rear = de_que(top, rear);
rear = de_que(top, rear);
rear = de_que(top, rear);
rear = de_que(top, rear);
rear = de_que(top, rear);
return 0;
}
9月9号更新
循环队列:
/*********************************************************************************
* Copyright: (C) 2021 li liangshi<1007146932@qq.com>
* All rights reserved.
*
* Filename: queue.c
* Description: This file is 循环队列
*
* Version: 1.0.0(2021年09月07日)
* Author: li liangshi <1007146932@qq.com>
* ChangeLog: 1, Release initial version on "2021年09月07日 19时17分58秒"
*
********************************************************************************/
#include <stdio.h>
#include <stdlib.h>
//#define QUEUE_SIZE 10;
typedef struct queue
{
int *value;
unsigned int front;
unsigned int rear;
unsigned int maxsize;
}QUEUE, *PQUEUE;
QUEUE Queue;
/* 创建空的循环队列 */
void Creatqueue(PQUEUE q, int maxsize)
{
q->value = (int *)malloc(sizeof(int) * maxsize);
q->front = 0;
q->rear = 0;
q->maxsize = maxsize;
}
/* 判断循环队列是否为空 */
int Emptqueue(PQUEUE q)
{
if(q->front == q->rear)
return 1;
else
return 0;
}
/* 判断循环队列是否已满 */
int Fullqueue(PQUEUE q)
{
if(q->front == (q->rear+1)%(q->maxsize))
return 1;
else
return 0;
}
/* 入队列 */
int In_queue(PQUEUE q, int value)
{
if(Fullqueue(q) == 0)
{
q->value[q->rear] = value;
q->rear = (q->rear+1)%q->maxsize;
return 1;
}
else
return 0;
}
/* 出队列 */
int Outqueue(PQUEUE q, int *val)
{
if(Emptqueue(q) == 0)
{
*val = q->value[q->front];
q->front = (q->front+1)%(q->maxsize);
return 1;
}
else
return 0;
}
int main (int argc, char **argv)
{
int data, i, num;
int val;
printf("你想新建一个多长的循环队列:");
scanf("%d", &num);
Creatqueue(&Queue, num);
for(i=1; i<num; i++)
{
printf("第%d个进去队列的数据是:", i);
scanf("%d", &data);
In_queue(&Queue, data);
}
printf("出队列!");
for(i=1; i<num; i++)
{
Outqueue(&Queue, &val);
printf("%d ", val);
}
printf("\n");
return 0;
}
运行结果截图