链队列的基本操作
链队列结构
typedef struct node {
int data;
struct node *next;
}Node;
typedef struct queue {
Node *front;
Node *rear;
}Queue;
初始化
bool InitQueue(Queue *q) {
q->front = (Node *)malloc(sizeof(Node));
if (q==NULL||q->front==NULL)
{
return false;
}
q->rear = q->front;
q->front->next = NULL;
return true;
}
入队
bool PushQueue(Queue *q,int data) {
Node *p = (Node *)malloc(sizeof(Node));
if (p==NULL)
{
return false;
}
p->data = data;
p->next = NULL;
q->rear->next = p;
q->rear = p;
return true;
}
出队
void PopQueue(Queue *q, int *data) {
if (q->front==q->rear)
{
return;
}
Node *p;
p = q->front->next;
*data = p->data;
q->front->next = p->next;
if (q->rear==p)
{
q->rear = q->front;
}
free(p);
}
获取队头元素
int GetHead(Queue *q) {
if (q->front!=q->rear)
{
return q->front->next->data;
}
return -1;
}
队列的长度
int Length(Queue *q) {
int len = 0;
Node *p = q->front->next;
while (p)
{
len++;
p = p->next;
}
return len;
}
获取队尾元素
int GetTail(Queue *q) {
if (q->front!=q->rear)
{
return q->rear->data;
}
return -1;
}
遍历队列
void printfQueue(Queue *q) {
Node *p = q->front->next;
while (p) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
测试代码
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<time.h>
typedef struct node {
int data;
struct node *next;
}Node;
typedef struct queue {
Node *front;
Node *rear;
}Queue;
bool InitQueue(Queue *q);
bool PushQueue(Queue *q,int data);
void PopQueue(Queue *q, int *data);
int Length(Queue *q);
int GetHead(Queue *q);
int GetTail(Queue *q);
void printfQueue(Queue *q);
int main() {
bool flag = true;
int choice;
int data;
int i = 1;
Queue *q = (Queue *)malloc(sizeof(Queue));
while (flag)
{
printf("\n====链队列的基本操作====\n");
printf("1.链队列的初始化\n");
printf("2.入队\n");
printf("3.出队\n");
printf("4.获取队的长度\n");
printf("5.返回队头元素\n");
printf("6.返回队尾元素\n");
printf("7.遍历队中的元素\n");
printf("===退出程序按任意值===\n");
printf("\n输入你的选择:");
scanf("%d", &choice);
switch (choice)
{
case 1:
if (InitQueue(q))
{
printf("\n初始化成功\n");
}
else {
printf("\n初始化失败\n");
}
break;
case 2:
printf("data = ");
scanf("%d", &data);
if (PushQueue(q,data))
{
printf("\n进队成功\n");
}
else {
printf("\n进队失败\n");
}
break;
case 3:
PopQueue(q, &data);
printf("%d \n", data);
break;
case 4:
printf("\n队的长度为:%d\n", Length(q));
break;
case 5:
if (GetHead(q)!=-1)
{
printf("\n队头元素为:%d\n", GetHead(q));
}
else {
printf("\n队列为空\n");
}
break;
case 6:
if (GetTail(q)!=-1)
{
printf("\n队尾元素为:%d\n", GetTail(q));
}
else {
printf("\n队列为空\n");
}
break;
case 7:
printfQueue(q);
break;
default:
flag = false;
break;
}
}
}
bool InitQueue(Queue *q) {
q->front = (Node *)malloc(sizeof(Node));
if (q==NULL||q->front==NULL)
{
return false;
}
q->rear = q->front;
q->front->next = NULL;
return true;
}
bool PushQueue(Queue *q,int data) {
Node *p = (Node *)malloc(sizeof(Node));
if (p==NULL)
{
return false;
}
p->data = data;
p->next = NULL;
q->rear->next = p;
q->rear = p;
return true;
}
void PopQueue(Queue *q, int *data) {
if (q->front==q->rear)
{
return;
}
Node *p;
p = q->front->next;
*data = p->data;
q->front->next = p->next;
if (q->rear==p)
{
q->rear = q->front;
}
free(p);
}
int Length(Queue *q) {
int len = 0;
Node *p = q->front->next;
while (p)
{
len++;
p = p->next;
}
return len;
}
int GetHead(Queue *q) {
if (q->front!=q->rear)
{
return q->front->next->data;
}
return -1;
}
int GetTail(Queue *q) {
if (q->front!=q->rear)
{
return q->rear->data;
}
return -1;
}
void printfQueue(Queue *q) {
Node *p = q->front->next;
while (p) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}