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();
}