前言
今天这篇文章我主要为大家链式队列的独特硬核写法,这是属于C语言中数据结构的内容,如果你对C语言基础知识还不熟悉话,可以关注下专栏教程或者自己找本书籍学习一下即可哦。
初识
这里可能大部分都不太知道有这样的一个数据类型,可以说该类型是英文size type的一个缩写,它是一种记录数据大小的数据类型(可以认为是一种整形数据)。其实我们经常使用的()的返回值数据类型就是数据结构与程序设计 c语言描述,只是我们常常用一个整形比如int来保存返回值。
值得我们注意的是:类型是一个与操作系统相关的数据类型,它主要是为了提高C语言的可移植性和可读性而加入的,可以说它并不是一种基本的数据类型,而且在头文件中用来重命名的数据类型。其实在我们平时很多地方都用到了,比如:
void memcpy(void s1, void const *s2,size_t n);
我们使用的时候几乎都用整形比如int变量来使用,并没有使用到类型,所以说尽管我们的int依赖于C编译器,有些情况并不是固定的,如果我们用基本类型替换可能带来数据类型过小或者过大的问题,过小可能会导致数据溢出问题,过大可能导致运行速度降低!的使用:只要是用到等返回值,或者传入值的变量都定义为类型!
初识队列
队列:一种特殊的操作受限制的线性表,用户仅允许在线性表的头部获取数据,在尾部插入数据数据结构与程序设计 c语言描述,所以大家也叫FIFO(先进先出)线性表。形象一点的表达:类似于一队人排队钻进一根只能进入一个人的管子,先进去的人先出来,后面的人只能在从同一个口子进入!
队列的类型:顺序队列和循环队列。顺序队列,出队列指针必须大于或者等于入队列指针,否则容易出现假溢出现象;而循环队列只要入队列指针与出队列指针不再次重合就不会溢出!
受类型限制的队列实现
首先我们先贴上刚刚写好的Queue.h
#include
#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 *);
接下来贴上刚刚写好的Queue.c
#include
#include
#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++,知识,喜欢我的文章就关注一波吧,每天带你学习C/C++不同的知识,也可以看到最新更新和之前发表的文章哦。如果足下基础比较差,不妨关注下人人都可以学习的视频教程
《C语言51课视频教程合集》《C++45课视频教程》
通俗易懂,深入浅出,一个视频只讲一个知识点。视频不深奥数据结构与程序设计 c语言描述-C语言数据结构硬核玩法?看这文章,C语言奇怪的知识又增加了,不需要钻研,在公交、在地铁、在厕所都可以观看,随时随地涨姿势。
如果你学到知识了,欢迎大家关注,转发,点赞,评论,这真的对我很重要哦!