数据结构链式队列

对队列进行以下操作:

1.入队列

2.出队列

3.取队首元素

队列先进先出,要想实现入队列,从队尾插入元素;要想实现出队列,从队首删除元素。在这里,我们定义头尾指针,首先对空队列插入元素,让头指针等于尾指针,如果非空,依然让头指针指向队首,尾指针指向要插入的元素。删除元素时,直接让头指针指向下一个元素,要删除的元素就成了无效的元素,这也就完成了头删。取队首元素时,函数的返回值代表是否取成功,0表示失败,1表示成功,这里用一个输出型参数value,把返回的元素放在value对应的内存当中,也就取出了这个元素。

linkqueue.h

//不带头结点的不带环的单向链式队列
#pragma once
#include<stdio.h>
#include<stddef.h>
#include<stdlib.h>
typedef char LinkType;
typedef struct LinkNode{
LinkType data;
struct LinkNode* next;
}LinkNode;
typedef struct LinkQueue{
LinkNode* head;
LinkNode* tail;
}LinkQueue;
void LinkQueueInit(LinkQueue* queue);//初始化函数
void LQPrintChar(LinkQueue* queue, const char* msg);//打印函数
LinkNode* LinkNodeCreate(LinkType value);//创建节点
void DestroyNode(LinkQueue* queue);//销毁节点
LinkNode* LinkQueuePush(LinkQueue* queue, LinkType value);//入队列
void LinkQueuePop(LinkQueue* queue);//出队列

int LinkQueueFront(LinkQueue* queue, LinkType* value);//取队首元素

linkqueue.c

#include "linkqueue.h"
void LinkQueueInit(LinkQueue* queue){//初始化函数
if (queue == NULL){
return;
}
queue->head = NULL;
queue->tail = NULL;
}
void LQPrintChar(LinkQueue* queue, const char* msg){
if (queue == NULL){
return;
}
printf("%s\n", msg);
printf("队首 ");
LinkNode* cur = queue->head;
for (; cur != NULL; cur = cur->next){
printf("[%c] ", cur->data);
}
printf(" 队尾\n");
}
LinkNode* LinkNodeCreate(LinkType value){
LinkNode* newnode = (LinkNode*)malloc(sizeof(LinkNode));
newnode->data = value;
newnode->next = NULL;
return newnode;
}
void DestroyNode(LinkQueue* queue){
free(queue->head);
free(queue->tail);
}
LinkNode* LinkQueuePush(LinkQueue* queue, LinkType value){//入队列
if (queue == NULL){
return NULL;
}
LinkNode* newnode = LinkNodeCreate(value);
if (queue->head == NULL){
//空队列
queue->head = queue->tail = newnode;
}
queue->tail->next = newnode;
queue->tail = queue->tail->next;
return queue->head;
}
void LinkQueuePop(LinkQueue* queue){//出队列
if (queue == NULL){
return;
}
if (queue->head == NULL){
//空队列
return;
}
queue->head = queue->head->next;
}
int LinkQueueFront(LinkQueue* queue, LinkType* value){//取队首元素
if (queue == NULL||value==NULL){
return 0;
}
if (queue->head == NULL){
//空队列
return 0;
}
*value = queue->head->data;
return 1;

}

test.c

#include "linkqueue.h"
#define TEST_HEADER printf("\n=====================%s======================\n",__FUNCTION__);
void TestInit(){
TEST_HEADER;
LinkQueue queue;
LinkQueueInit(&queue);
LQPrintChar(&queue,"初始化函数");
}
void TestPush(){
TEST_HEADER;
LinkQueue queue;
LinkQueueInit(&queue);
LinkQueuePush(&queue, 'a');
LinkQueuePush(&queue, 'b');
LinkQueuePush(&queue, 'c');
LinkQueuePush(&queue, 'd');
LQPrintChar(&queue, "入队列四个元素");
LinkType value;
int ret = LinkQueueFront(&queue, &value);
printf("expect ret is 1,actual is %d\n", ret);
printf("expect value is a,actual is %c\n", value);
printf("\n");


LinkQueuePop(&queue);
LinkQueuePop(&queue);
LQPrintChar(&queue, "出队列两个元素");
ret = LinkQueueFront(&queue, &value);
printf("expect ret is 1,actual is %d\n", ret);
printf("expect value is c,actual is %c\n", value);
printf("\n");


LinkQueuePop(&queue);
LinkQueuePop(&queue);
LQPrintChar(&queue, "再出队列两个元素");
ret = LinkQueueFront(&queue, &value);
printf("expect ret is 0,actual is %d\n", ret);
printf("\n");


LinkQueuePop(&queue);
LinkQueuePop(&queue);
LQPrintChar(&queue, "尝试对空队列删除元素");
ret = LinkQueueFront(&queue, &value);
printf("expect ret is 0,actual is %d\n", ret);
printf("\n");


}
int main(){
TestInit();
TestPush();
getchar();
return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40995354/article/details/79963539