您的位置:首页 > 理论基础 > 数据结构算法

数据结构C语言版(五)队列

2020-07-12 17:29 148 查看

1. 队列

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。

2. 链式队列实现

头文件声明

#pragma once
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

#ifdef __cplusplus
extern "C"{
#endif
//队列先进先出,所以队列的头为链表头,头部抛出,尾部压入
//不支持遍历和随插随取
struct QueueNode
{
struct QueueNode * next;
};
struct LinkQueue
{
struct QueueNode header;
int size;//村粗
struct QueueNode * last;//尾指针,指向链表的最后一个结点
};
typedef void * queueelement;
//初始化
queueelement Init_queue();
//插入
void push_queue(queueelement queue,void * data);
//抛出
void pop_queue(queueelement queue);
//队列首元素
void * first_queue(queueelement queue);
//队列尾元素
void * last_queue(queueelement queue);
//队列元素个数
int size_queue(queueelement queue);
//销毁队列
void Destroy_queue(queueelement queue);

#ifdef __cplusplus
}
#endif
#include"linkqen.h"
//struct QueueNode
//	{
//		struct QueueNode * next;
//	};
//	struct LinkQueue
//	{
//		struct QueueNode header;
//		int size;//存储
//		struct QueueNode * last;//尾指针,指向链表的最后一个结点
//	};
//	typedef void * queueelement;
//初始化
queueelement Init_queue()
{
struct LinkQueue * que = (struct LinkQueue *)malloc(sizeof(struct LinkQueue));
if (NULL ==que)
return NULL;
que->header.next = NULL;
que->size =0;
que->last = &(que->header);
return que;
}
//插入
void push_queue(queueelement queue,void * data)
{
if(NULL == queue)
return;
if(NULL == data)
return;
struct LinkQueue * que=(struct LinkQueue *)queue;
struct QueueNode  * node = (struct QueueNode  *)data;
que->last->next = node;
node->next = NULL;
que->last = node;
que->size++;

}
//抛出
void pop_queue(queueelement queue)
{
if(NULL == queue)
return;
struct LinkQueue * que=(struct LinkQueue *)queue;
if (que->size == 0)
return;
if(que->size == 1)
{
que->header.next = NULL;
que->last=&(que->header);
que->size =0;
return;
}
struct QueueNode  * node = que->header.next;
que->header.next = node->next;
que->size--;

}
//队列首元素
void * first_queue(queueelement queue)
{
if(NULL == queue)
return NULL;
struct LinkQueue * que=(struct LinkQueue *)queue;
return que->header.next;

}
//队列尾元素
void * last_queue(queueelement queue)
{
if(NULL == queue)
return NULL;
struct LinkQueue * que=(struct LinkQueue *)queue;
return que->last;
}
//队列元素个数
int size_queue(queueelement queue)
{
if(NULL == queue)
return -1;
struct LinkQueue * que=(struct LinkQueue *)queue;
return que->size;
}
//销毁队列
void Destroy_queue(queueelement queue)
{
if(NULL == queue)
return;
free(queue);

}
#include"linkqen.h"
//struct QueueNode
//	{
//		struct QueueNode * next;
//	};
//	struct LinkQueue
//	{
//		struct QueueNode header;
//		int size;//存储
//		struct QueueNode * last;//尾指针,指向链表的最后一个结点
//	};
//	typedef void * queueelement;

struct person
{
struct QueueNode header;
char name[64];
int age;
};

void test()
{
person p1={NULL,"a",10};
person p2={NULL,"b",20};
person p3={NULL,"c",30};
person p4={NULL,"d",40};
person p5={NULL,"e",50};
queueelement q = Init_queue();
push_queue(q,&p1);
push_queue(q,&p2);
push_queue(q,&p3);
push_queue(q,&p4);
push_queue(q,&p5);
person * l =(person *) last_queue(q);
printf("队尾元素:name:%s age: %d\n",l->name,l->age);
while(size_queue(q)>0)
{
person * f = (person *)first_queue(q);
printf("name:%s age: %d\n",f->name,f->age);
pop_queue(q);
}
printf("%d\n",size_queue(q));
Destroy_queue(q);
}
void main()
{
test();
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: