定义一个节点,里面包含元素类型,指向下一个节点的指针。然后定义一个结构体,里面两个指针,指向队头和队尾
typedef struct QNode {
int data;
struct QNode * next;
}QNode, * Queue;
typedef struct {
Queue front;
Queue rear;
}LinkQueue;
入队操作要注意别动指向队头的front指针,如果是q->front->next = p那每次就会插到队头。而队列是队头出,队尾进。也不要忘了新节点p->next = NULL;
void EnQueue(LinkQueue * q, int x)
{
Queue p = (Queue)malloc(sizeof(QNode));
if (!p) {
printf("无内存空间可分配\n");
}
p->data = x;
p->next = NULL;
q->rear->next = p;
q->rear = p;
}
出队别忘了最后的判断是否头尾指向了一个节点
void DeQueue(LinkQueue * q)
{
QNode * p;
if (IsEmpty(&q)) {
printf("空列\n");
}
p = q->front->next;
q->front->next = p->next;
if (q->rear == p) q->rear = q->front;
free(p);
printf("出队成功\n");
}
输出队列元素,首先判断是否为空。不要动队头和队尾指针,否则你移动了了个指针就破坏了队列结构,你将队头指针的地址告诉节点指针,让节点进行遍历,从而进行保护
void print(LinkQueue * q)
{
QNode * p = q->front->next;
if (IsEmpty(&q)) {
printf("空队\n");
}
while (p) {
printf("%d ", p->data);
p = p->next;
}
printf("\n\n");
}
具体实现如下
#include<stdio.h>
#include<stdlib.h>
typedef struct QNode {
int data;
struct QNode * next;
}QNode, * Queue;
typedef struct {
Queue front;
Queue rear;
}LinkQueue;
void InitialQueue(LinkQueue * q)
{
q->front = q->rear = (Queue)malloc(sizeof(QNode));
if (!q->front) {
printf("无内存空间可分配\n");
}
q->front->next = NULL;
printf("初始化成功\n");
}
void EnQueue(LinkQueue * q, int x)
{
Queue p = (Queue)malloc(sizeof(QNode));
if (!p) {
printf("无内存空间可分配\n");
}
p->data = x;
p->next = NULL;
q->rear->next = p;
q->rear = p;
}
int IsEmpty(LinkQueue * q)
{
return (q->front== q->rear)?1:0;
}
void DeQueue(LinkQueue * q)
{
QNode * p;
if (IsEmpty(&q)) {
printf("空列\n");
}
p = q->front->next;
q->front->next = p->next;
if (q->rear == p) q->rear = q->front;
free(p);
printf("出队成功\n");
}
void DesQueue(LinkQueue * q)
{
while (q->front) {
q->rear = q->front->next;
free(q->front);
q->front = q->rear;
}
printf("销毁成功\n");
exit(1);
}
void print(LinkQueue * q)
{
QNode * p = q->front->next;
if (IsEmpty(&q)) {
printf("空队\n");
}
while (p) {
printf("%d ", p->data);
p = p->next;
}
printf("\n\n");
}
int main(void)
{
LinkQueue queue;
int num, flag;
InitialQueue(&queue);
int count;
int i = 0;
printf("输入队列初始化大小:");
scanf("%d", &count);
while (i++ < count) {
scanf("%d", &num);
EnQueue(&queue, num);
}
getchar();
printf("1.入队 2.出队\n");
printf("3.判断队是否为空 4.输出队列 5.销毁队列 6.退出\n");
while (scanf("%d", &flag) && flag != 6) {
switch (flag) {
case 1: printf("输入入队元素:");scanf("%d", &num);EnQueue(&queue, num);break;
case 2: DeQueue(&queue);break;
case 3: printf("%s\n\n", IsEmpty(&queue)==1?"空队":"非空队");break;
case 4: print(&queue);break;
case 5: DesQueue(&queue);break;
default: printf("请输入合法操作!\n\n");break;
}
printf("1.入队 2.出队\n");
printf("3.判断队是否为空 4.输出队列 5.销毁队列 6.退出\n");
}
return 0;
}