vlambda博客
学习文章列表

C语言数据结构硬核玩法?看这文章,C语言奇怪的知识又增加了

前言

今天这篇文章我主要为大家链式队列的独特硬核写法,这是属于C语言中数据结构的内容。

C语言数据结构硬核玩法?看这文章,C语言奇怪的知识又增加了


初识队列


队列:一种特殊的操作受限制的线性表,用户仅允许在线性表的头部获取数据,在尾部插入数据,所以大家也叫FIFO(先进先出)线性表。形象一点的表达:类似于一队人排队钻进一根只能进入一个人的管子,先进去的人先出来,后面的人只能在从同一个口子进入!

队列的类型:顺序队列和循环队列。顺序队列,出队列指针必须大于或者等于入队列指针,否则容易出现假溢出现象;而循环队列只要入队列指针与出队列指针不再次重合就不会溢出!

受类型限制的队列实现

首先我们先贴上刚刚写好的Queue.h

#include<stdio.h>
#ifndef __QUEUE_H__
#define __QUEUE_H__
/***************************************
*fuction :数据类型定义
**************************************/
//节点数据类型定义
typedef struct _tag_stNode
{
void *data; //数据指针
struct _tag_stNode *next;//指向下一个节点
}STNode;
//队列结构体定义
typedef struct _tag_stQueue
{
int QueueSize; //队列大小
size_t memSize; //数据大小
STNode *head; //头指针
STNode *tail; //尾指针
}STQueue;
/***************************************
*fuction :函数接口声明
**************************************/
//队列接口函数定义
void QueueInit(STQueue *q, size_t memSize);
int QueueIn(STQueue *, const void *);
void QueueOut(STQueue *, void *);
void GetQueueUnit(STQueue *, void *);
void ClearQueue(STQueue *);
int GetQueueSize(STQueue *);
#endif

接下来贴上刚刚写好的Queue.c

#include <stdlib.h>
#include <string.h>
#include "Queue.h"
/***************************************
*fuction :队列初始化
**************************************/
void QueueInit(STQueue *q, size_t memSize)
{
q->QueueSize = 0;
q->memSize = memSize;
q->head = q->tail = NULL;
}
/***************************************
*fuction :入队列
**************************************/
int QueueIn(STQueue *q, const void *data)
{
STNode *newNode = (STNode *)malloc(sizeof(STNode));
if(newNode == NULL)
{
return -1;
}
newNode->data = malloc(q->memSize);
if(newNode->data == NULL)
{
free(newNode);
return -1;
}
newNode->next = NULL;
memcpy(newNode->data, data, q->memSize);
if(q->QueueSize == 0)
{
q->head = q->tail = newNode;
}
else
{
q->tail->next = newNode;
q->tail = newNode;
}
q->QueueSize++;
return 0;
}
/***************************************
*fuction :出队列
**************************************/
void QueueOut(STQueue *q, void *data)
{
if(q->QueueSize > 0)
{
STNode *temp = q->head;
memcpy(data, temp->data, q->memSize);
if(q->QueueSize > 1)
{
q->head = q->head->next;
}
else
{
q->head = NULL;
q->tail = NULL;
}
q->QueueSize--;
free(temp->data);
free(temp);
}
}
/***************************************
*fuction :获得队列头部数据
**************************************/
void GetQueueUnit(STQueue *q, void *data)
{
if(q->QueueSize > 0)
{
STNode *temp = q->head;
memcpy(data, temp->data, q->memSize);
}
}
/***************************************
*fuction :清除队列
**************************************/
void ClearQueue(STQueue *q)
{
STNode *temp;
while(q->QueueSize > 0)
{
temp = q->head;
q->head = temp->next;
q->QueueSize--;
free(temp->data);
free(temp);
}
q->head = NULL;
q->tail = NULL;
}
/***************************************
*fuction :获得队列数据个数
**************************************/
int GetQueueSize(STQueue *q)
{
return q->QueueSize;
}

最后就是我们的测试代码:

#include "Queue.h"
/***************************************
*fuction :测试函数
**************************************/
int main(void)
{
int val;
STQueue q;
QueueInit(&q, sizeof(int));
for(val = 0; val < 10; val++)
{
QueueIn(&q, &val);
printf("Data: %d enter Quene.\n", val + 1);
}
printf("\n");
GetQueueUnit(&q, &val);
printf("The value that is at the front of the queue is %d\n\n", val + 1);
while(GetQueueSize(&q) > 0)
{
QueueOut(&q, &val);
printf("Data: %d exit Quene.\n", val + 1);
}
printf("欢迎大家关注,转发,点赞,留言");
return 0;
}

尾言

每天最浅显的介绍C语言、C++,windows知识,喜欢我的文章就关注一波吧,每天带你学习C/C++不同的知识,也可以看到最新更新和之前发表的文章哦。如果足下基础比较差,不妨关注下人人都可以学习的视频教程

通俗易懂,深入浅出,一个视频只讲一个知识点。视频不深奥,不需要钻研,在公交、在地铁、在厕所都可以观看,随时随地涨姿势。