认识链式队列
利用数组实现了循环队列,这是静态的队列,缺点是需要预设大小,当队列满时,无法再插入新的数据,只有等队头的数据被取走以后才能往队列放入新的数据。
还可以利用链表实现队列,这种方式动态创建节点需要的内存,当有新的数据节点要加入时,才去申请内存空间,不需要预设大小,整个队列需要的内存空间不需要连续,并且插入删除更容易实现。但是同时也带来存取速度慢的缺点,操作也比数组的方式更加复杂。
其实用链表实现队列的方式十分简单,只需要在单链表的基础上,增加一个尾指针即可。因为队列的特点是“先进先出”,因此我们只需要在一头一尾两个指针,就可以快速地在队头取出数据,在队尾插入数据。
对于队列的基本的操作主要有以下几种操作:
- 初始化
- 出队列
- 入队列
- 销毁
- 取队首元素
test.h
#define _CRT_SECURE_NO_WARNINGS
#pragma once
#include <stdio.h>
#include <stdlib.h>
typedef char LinkQType;
typedef struct LinkQNode{
LinkQType data;
struct LinkQNode* next;
}LinkQNode;
typedef struct LinkQ{
LinkQNode* head;//不带头结点
LinkQNode* tail;
}LinkQ;
void LinkQInit(LinkQ* sq);
void LinkQPrint(LinkQ* sq, const char* msg);
void LinkQDestroy(LinkQ* sq);
LinkQNode* LinkQPush(LinkQ* sq, LinkQType value);
LinkQType* LinkQPop(LinkQ* sq);
int LinkQTop(LinkQ* sq, LinkQType* value);
test.c及测试函数
#define _CRT_SECURE_NO_WARNINGS
#include "test.h"
void LinkQInit(LinkQ* sq){
if (sq == NULL){
return;
}
sq->head = NULL;
sq->tail = NULL;
}
void LinkQPrint(LinkQ* sq, const char* msg){
printf("[%s]\n", msg);
if (sq == NULL){
return;
}
LinkQNode* cur = sq->head;
for (; cur!= NULL; cur = cur->next){
printf("[%c|%p]\n", cur->data);
}
printf("\n");
}
void LinkQDestroy(LinkQ* sq){
free(sq->head);
free(sq->tail);
}
LinkQNode* CreateNode( LinkQType value){
LinkQNode * newnode = (LinkQNode*)malloc(sizeof(LinkQNode));
newnode->data = value;
newnode->next = NULL;
return newnode;
}
LinkQNode* LinkQPush(LinkQ* sq, LinkQType value){
if (sq == NULL){
return NULL;
}
LinkQNode* newnode = CreateNode(value);
if (sq->head == NULL){
sq->head = sq->tail = newnode;
}
sq->tail->next = newnode;
sq->tail = sq->tail->next;
return sq->head;
}
LinkQType* LinkQPop(LinkQ* sq){
if (sq == NULL){
return;
}
if (sq->head == NULL){
//空链表
return;
}
sq->head = sq->head->next;
//一个节点
/*if (sq->head == sq->tail){
sq->head = sq->tail = NULL;
return;
}*/
//多个节点
/*LinkQNode* to_delete = sq->head;
sq->head= to_delete->next;
LinkQDestroy(to_delete);
}*/
}
int LinkQTop(LinkQ* sq, LinkQType* value){
if (sq == NULL||value==NULL){
return 0;
}
if (sq->head == NULL){
//队列为空
return 0;
}
*value = sq->head->data;
return *value;
}
//////////////////////////////////////////////
/////////////////////test.c//////////////////
////////////////////////////////////////////
#define TEST_HEADER printf("\n=========%s=========\n",__FUNCTION__);
void test1(){
TEST_HEADER;
LinkQ *sq;
LinkQInit(&sq);
LinkQPush(&sq, 'f');
LinkQPush(&sq, 'b');
LinkQPush(&sq, 'c');
LinkQPush(&sq, 'd');
LinkQPrint(&sq, "入队列四个元素");
LinkQType value;
LinkQTop(&sq, &value);
printf("%c\n", value);
LinkQPop(&sq);
/*LinkQTop(&sq, &value);
printf("%c\n", value);
LinkQPop(&sq);
LinkQTop(&sq, &value);
printf("%c\n", value);
LinkQPop(&sq);
LinkQTop(&sq, &value);
printf("%c\n", value);
LinkQPop(&sq);*/
}
int main(){
test1();
//test2();
//test3();
getchar;
return;
}