链队列,与循环队列(损失一个空间)的C语言版基本操作
#include <stdio.h>
#include <stdlib.h>
#define MAX 100
typedef struct qnode
{
int data;
struct qnode* next;
}DataNode;
typedef struct
{
DataNode* front;
DataNode* rear;
}LinkQuNode;
LinkQuNode* InitQueue1(LinkQuNode* q)//初始化
{
q = (LinkQuNode*)malloc(sizeof(LinkQuNode));
q->front = q->rear = NULL;
return q;
}
void enQueue1(LinkQuNode* q, int e)//入队
{
DataNode* p;
p = (DataNode*)malloc(sizeof(DataNode));
p->data = e;
p->next = NULL;
if (q->rear == NULL)
q->front = q->rear = p;
else
{
q->rear->next = p;
q->rear = p;
}
}
int deQueue1(LinkQuNode* q, int e)//出队
{
DataNode* t;
if (q->rear == NULL)
return 0;
t = q->front;
if (q->front == q->rear)
q->front = q->rear = NULL;
else
q->front = q->front->next;
e = t->data;
free(t);
return 1;
}
void DestroyQueue1(LinkQuNode* q)//销毁
{
DataNode* pre = q->front, * p;
if (pre != NULL)
{
p = pre->next;
while (p != NULL)
{
free(pre);
pre = p; p = p->next;
}
free(pre);
}
free(q);
printf("销毁队列成功\n");
}
void output1(LinkQuNode* q)//遍历
{
DataNode* p = q->front;
while(p!=NULL)
{
printf("%3d", p->data);
p = p->next;
}
}
typedef struct
{
int data[MAX];
int front, rear;
}SqQueue;
SqQueue* InitQueue2(SqQueue* q)//初始化
{
q = (SqQueue*)malloc(sizeof(SqQueue));
q->front = q->rear = -1;
return q;
}
int enQueue2(SqQueue* q, int e)//入队
{
if ((q->rear + 1) % MAX == q->front)
return 0;
q->data[q->rear] = e;
q->rear = (q->rear + 1) % MAX;
return 1;
}
int IsEmpty2(SqQueue* Q)//是否为空
{
return (Q->rear == Q->front);
}
int GetLength2(SqQueue* q)//求队列长度
{
if (q->front == q->rear)
{
printf("队空\n");
return 0;
}
else
return ((q->rear - q->front + MAX) % MAX);
}
void Output2(SqQueue* q)//输出
{
int i = 0;
int j = q->front;
if (IsEmpty2(q))
{
printf("顺序队列为空!\n");
}
else {
while (i < GetLength2(q))
{
printf("%d\t", q->data[j]);
j = (j + 1) % MAX;
i++;
}
printf("\n");
}
}
int deQueue2(SqQueue* q, int e)//出队
{
if (q->front == q->rear)
return 0;
q->front = (q->front + 1) % MAX;
e = q->data[q->front];
return 1;
}
main()
{
int x, i, a, b, c=0,n;
LinkQuNode* q;
SqQueue* s;
printf("输入1执行链栈 输入2执行顺序栈 输入0结束执行\n");
while (c == 0)
{
printf("\n");
printf("请按菜单输入数字:");
scanf("%d", &c);
switch (c)
{
case 1:
q = InitQueue1(q);
printf("初始化成功!\n");
printf("输入元素个数\n");
scanf("%d", &x);
printf("请输入入队数字\n");
for (i = 0; i < x; i++)
{
scanf("%d", &a);
enQueue1(q, a);
}
printf("遍历\n");
output1(q);
deQueue1(q, b);
printf("\n");
printf("出队遍历\n");
output1(q);
printf("\n");
DestroyQueue1(q);
output1(q);break;
case 2:
s=InitQueue2(s);
printf("初始化成功!\n");
printf("输入元素个数\n");
scanf("%d", &x);
printf("请输入入队数字\n");
for (i = 0; i < x; i++)
{
scanf("%d", &a);
enQueue2(s, a);
}
n = GetLength2(s);
printf("队列长度为\n");
printf("%d\n", n);
printf("顺序队列为\n");
Output2(s);
deQueue2(s, x);
printf("出队后队列数字为:\n");
Output2(s);
}
}
}