队列
sequeue
.h
#pragma once
#ifndef _SEQUEUE_H_
#define _SEQUEUE_H_
#include <stdio.h>
#include<stdlib.h>
#define N 32
typedef int DataType;
typedef struct sequeue
{
DataType data[N];
int front;//保存队头下标
int rear;//保存插入元素下表的后一位
}sequeue;
//创建一个空的队列
sequeue* SequeueCreate();
//入队
void SequeueInput(sequeue* info, DataType data);
DataType SequeueOutput(sequeue* q);
#endif
.c
#include"sequeue.h"
sequeue* SequeueCreate()
{
sequeue* head = (sequeue*)malloc(sizeof(sequeue));
head->front = head->rear = 0;
return head;
}
//入队
void SequeueInput(sequeue* info, DataType data)
{
if (info == NULL)
{
printf("队列不存在!\n");
}
if ((info->rear+1)%N==(info->front)) //队满
{
printf("队满\n");
return;
}
//赋值
info->data[info->rear] = data;
info->rear = (info->rear + 1) % N;
return;
}
DataType SequeueOutput(sequeue* q)
{
if (q == NULL)
{
printf("队列不存在!\n");
return (DataType)-1;
}
if (q->front == q->rear)
{
printf("队列为空!\n");
return (DataType)-1;
}
DataType data = q->data[q->front];
q->front = (q->front + 1) % N;
return data;
}
main.c
#include"sequeue.h"
int main(void)
{
sequeue * q= SequeueCreate();
for (int i = 0; i < 31; i++)
{
SequeueInput(q, i + 1);
printf("%d入队\n", i + 1);
}
DataType data;
for (int i = 0; i < 31; i++)
{
data=SequeueOutput(q);
printf("%d出队\n",data);
}
}
linkqueue
.h
#pragma once
#ifndef _LINKQUEUE_H_
#define _LINKQUEUE_H_
#include <stdio.h>
#include<stdlib.h>
typedef int Datatype;
//定义一个节点
typedef struct node//队列节点结构体
{
Datatype data;//数据域
struct node* next;//指针域
}node;
typedef struct linkqueue
{
node* front;//队头指针
node* rear;//队尾指针
}linkqueue;
//创建一个空队列
linkqueue* LinkQueuecreate();
//入队(尾插法)
void LinkQueuqInput(linkqueue* info, Datatype data);
//出队(头删法
Datatype LinkQueueOutput(linkqueue* info);
#endif // !_LINKQUEUE_H_
.c
#include"linkqueue.h"
//创建一个空队列
linkqueue* LinkQueuecreate()
{
//为队列信息开辟空间
linkqueue* Info = (linkqueue*)malloc(sizeof(linkqueue));
if (Info == NULL)
{
printf("malloc failure\n");
return NULL;
}
//赋初值
Info->front = NULL;
Info->rear = NULL;
//为头节点开辟空间
node* head = (node*)malloc(sizeof(node));
if (head == NULL)
{
printf("malloc failure\n");
return NULL;
}
//赋初值
head->next = NULL;
Info->front = Info->rear=head;
return Info;
}
//入队(尾插法)
void LinkQueuqInput(linkqueue* info, Datatype data)
{
if (info == NULL || info->front == NULL)
{
printf("队列不存在!\n");
return;
}
//申请一个新节点
node* temp = (node*)malloc(sizeof(node));
if (temp == NULL)
{
printf("malloc failure\n");
return NULL;
}
temp->next = NULL;
temp->data = data;
//使用rear指针进行尾插法
temp->next = info->rear->next;
info->rear->next =temp ;
info->rear = temp;//rear保存最新插入的元素的地址
return;
}
//出队(头删法
Datatype LinkQueueOutput(linkqueue* info)
{
if (info == NULL || info->front == NULL)
{
printf("队列不存在!\n");
return;
}
if (info->front == info->rear)
{
printf("队列为空!\n");
return;
}
node* p = info->front->next;
Datatype data = p->data;
info->front->next = p->next;//将第二个节点的地址保存在头节点的指针域
free(p);
p = NULL;
if (info->front->next == NULL)//如果是最后一个元素出队,rear会变成野指针
{
info->rear = info->front;
}
return data;
}
main.c
#include"linkqueue.h"
int main(void)
{
linkqueue* q = LinkQueuecreate();
for (int i = 0; i < 10; i++)
{
LinkQueuqInput(q, i + 1);
printf("%d入队\n", i + 1);
}
Datatype data;
for (int i = 0; i <10; i++)
{
data = LinkQueueOutput(q);
printf("%d出队\n", data);
}
}