先行队列(循环队列)
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#define max 51
#define initSize 100
struct People
{
char name[max];
char ID[max];
};
typedef struct
{
People people[initSize];
unsigned int front , rear;
int flag;
}Queue;
void initQueue(Queue& que);
bool QueueEmpty(Queue que);
bool QueueFull(Queue que);
bool enQueue(Queue& que, People peo);
bool deQueue(Queue& que , People& peo);
People getHead(Queue que);
void printPeo(People peo);
void main()
{
Queue que;
initQueue(que);
People peo[4] = { {"李参政" , "0418"} , { "参政" ,"0418"} , {"政" ,"0418"} ,{"李" ,"0418"} };
for (int i = 0; i < 4; i++)
{
enQueue(que, peo[i]);
}
for (int i = 0; i < 4; i++)
{
People peo;
deQueue(que, peo);
printf("%d --------\n" , 3-i);
printPeo(peo);
}
}
void initQueue(Queue& que)
{
que.flag = 0;
que.front = que.rear = 0;
}
bool QueueEmpty(Queue que)
{
if ( que.front = que.rear && que.flag == 0)
return true;
return false;
}
bool QueueFull(Queue que)
{
if (que.flag == 1)
return true;
return false;
}
bool enQueue(Queue& que, People peo)
{
if (QueueFull(que))
return false;
que.people[que.front % initSize] = peo;
++que.front;
if (que.front - que.rear == initSize - 1)
que.flag = 1;
else
que.flag = 0;
return true;
}
bool deQueue(Queue& que, People& peo)
{
peo = que.people[que.rear % initSize];
++que.rear;
if (que.front - que.rear == initSize - 1)
que.flag = 1;
else
que.flag = 0;
return true;
}
People getHead(Queue que)
{
People peo = que.people[que.front % initSize];
return peo;
}
void printPeo(People peo)
{
printf("name = %s\n", peo.name);
printf("ID = %s\n", peo.ID);
printf("-------------------------------\n");
}
队列的链式存储
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#define max 51
struct People
{
char name[max];
char ID[max];
};
typedef struct QNode
{
People people;
struct QNode* next;
struct QNode* previous;
}QNode;
typedef struct
{
struct QNode* front, * rear;
}linkQueue;
void initQueue(linkQueue& que);
bool QueueEmpty(linkQueue que);
bool enQueue(linkQueue& que, People peo);
bool deQueue(linkQueue& que , People& peo);
People getHead(linkQueue que);
bool destroy(linkQueue& que);
void printPeo(People peo);
int main()
{
linkQueue que;
initQueue(que);
People peo[4] = { {"李参政" , "0418"} , { "参政" ,"0418"} , {"政" ,"0418"} ,{"李" ,"0418"} };
for (int i = 0; i < 4; i++)
{
enQueue(que, peo[i]);
}
for (int i = 0; i < 4; i++)
{
People peo;
deQueue(que, peo);
printf("%d --------\n" , 3-i);
printPeo(peo);
}
destroy(que);
return 0;
}
void initQueue(linkQueue& que)
{
que.front = (QNode*)malloc(sizeof(QNode));
que.front->previous = NULL;
que.rear = (QNode*)malloc(sizeof(QNode));
que.rear->next = NULL;
que.front->next = que.rear;
que.rear->previous = que.front;
}
bool QueueEmpty(linkQueue que)
{
if (que.front->next == que.rear && que.rear->previous == que.front)
return true;
return false;
}
bool enQueue(linkQueue& que, People peo)
{
QNode* newpeo = (QNode*)malloc(sizeof(QNode));
newpeo->people = peo;
newpeo->next = que.front->next;
que.front->next->previous = newpeo;
newpeo->previous = que.front;
que.front->next = newpeo;
return true;
}
bool deQueue(linkQueue& que, People& people)
{
if (QueueEmpty(que))
return false;
QNode* peo = que.rear->previous;
peo->previous->next = peo->next;
que.rear->previous = peo->previous;
people = peo->people;
free(peo);
return true;
}
People getHead(linkQueue que)
{
People peo = que.front->next->people;
return peo;
}
bool destroy(linkQueue& que)
{
if (!QueueEmpty(que))
return false;
free(que.rear);
free(que.front);
return true;
}
void printPeo(People peo)
{
printf("name = %s\n", peo.name);
printf("ID = %s\n", peo.ID);
printf("-------------------------------\n");
}