题主这队列的定义也不太对啊。给题主一份完整的队列操作代码吧。
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#define elemType int /* 单链队列元素数据类型 */
#define QNODE_SIZE sizeof (struct qNode) /* 单链队列结点空间大小 */
#define status int /* 状态型变量 */
#define OVERFLOW -1 /* 内存溢出状态码 */
#define ERROR 0 /* 错误状态码 */
#define OK 1 /* 正确状态码 */
/* 单链队列结点存储结构 */
typedef struct qNode {
elemType data;
struct qNode *next;
} qNode, *qNodePtr;
/* 单链队列存储结构 */
typedef struct linkQueue {
qNodePtr front; /* 队头指针 */
qNodePtr rear; /* 队尾指针 */
} linkQueue;
/* 初始化 */
/* 操作结果:构造一个带头结点的空单链队列Q */
void initQueue (linkQueue *Q) {
Q->front = Q->rear = (qNodePtr) malloc (QNODE_SIZE); /* 产生头结点,并使队头、队尾指针均指向此头结点 */
if (!Q->front) /* 内存分配失败 */
exit (OVERFLOW);
Q->front->next = NULL;
}
/* 销毁 */
/* 初始条件:单链队列Q已存在。操作结果:销毁单链队列Q */
void destroyQueue (linkQueue *Q) {
qNodePtr p, q;
p = Q->front; /* p指向Q的头结点 */
while (p) {
q = p->next; /* q指向p的下一个结点 */
free (p); /* 回收p指向的结点 */
p = q; /* p移动到下一个结点 */
} /* 直到没有下一个结点 */
}
/* 判断单链队列是否为空 */
/* 初始条件:单链队列Q已存在。操作结果:若Q为空队列,则返回TRUE,否则返回FALSE */
status queueIsEmpty (linkQueue *Q) {
return Q->front->next == NULL;
}
/* 求单链队列长度 */
/* 初始条件:单链队列Q已存在。操作结果:返回Q中数据元素个数 */
int queueLength (linkQueue *Q) {
int i = 0;
qNodePtr p;
p = Q->front->next; /* p指向队列的第一个结点 */
while (p) { /* 未到队尾 */
i++;
p = p->next;
}
return i;
}
/* 入队 */
/* 操作结果:在Q的队尾插入新的元素e */
status push (linkQueue *Q, elemType e) {
qNodePtr p;
p = (qNodePtr) malloc (QNODE_SIZE); /* 产生新结点 */
if (!p) /* 内存分配失败 */
exit (OVERFLOW);
p->data = e;
p->next = NULL;
Q->rear->next = p; /* 将新结点链接到队尾之后 */
Q->rear = p; /* 队尾指向新结点 */
}
/* 出队 */
/* 操作结果:删除Q的队头元素,并由e返回其值 */
status pop (linkQueue *Q, elemType *e) {
qNodePtr p;
if (queueIsEmpty (Q))
return ERROR;
p = Q->front->next; /* p指向队列的第一个结点 */
*e = p->data; /* 取出数据 */
Q->front->next = p->next;
free (p); /* 删除该结点 */
if (Q->rear == p){ /* 队列为空 */
Q->rear = Q->front; /* 队头、队尾指针均指向Q的头结点 */
Q->front->next = NULL;
}
return OK;
}
/* 打印队列内容 */
/* 初始条件:单链队列Q已存在。操作结果:当队列不为空时,打印队列内容并返回OK,否则返回ERROR */
status printQueue (linkQueue *Q) {
qNodePtr p;
if (queueIsEmpty (Q)) {
puts ("The queue is empty! ");
return ERROR;
}
p = Q->front->next;
while (p) {
printf ("%d\t", p->data);
p = p->next;
}
putchar ('\n');
return OK;
}
int main (void) {
linkQueue Q;
elemType e;
elemType a, b, c, d;
a = 1; b = 2; c = 3; d = 4;
/* 初始化队列,并插入若干元素 */
initQueue (&Q);
push (&Q, a);
push (&Q, b);
push (&Q, c);
push (&Q, d);
/* 打印队列内容、队列长度 */
printf ("Q:\t");
printQueue (&Q);
printf ("queueLength:\t%d\n", queueLength (&Q));
destroyQueue (&Q);
getch (); /* 屏幕暂留 */
return 0;
}
![](https://video.ask-data.xyz/img.php?b=https://iknow-pic.cdn.bcebos.com/1b4c510fd9f9d72a4dcf3149da2a2834349bbb3e?x-bce-process=image%2Fresize%2Cm_lfit%2Cw_600%2Ch_800%2Climit_1%2Fquality%2Cq_85%2Fformat%2Cf_auto)
以上是“链队列”代码,如果题主想要“顺序队列”的话,以下就只写出定义和求长度部分了
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define n 20
typedef int elementtype;
typedef struct {
elementtype element[n];
elementtype *f, *r; /* 这里需要头尾指针 */
} CQueue;
/* 求顺序队列长度 */
/* 初始条件:顺序队列Q已存在。操作结果:返回Q中数据元素个数 */
int queueLength (CQueue *Q) {
int i = 0;
elementtype *p;
p = Q->f; /* p指向队列的第一个结点 */
while (p <= Q->r) { /* 未到队尾 */
i++;
p++;
}
return i;
}
int main (void) {
CQueue Q;
int len;
/* 顺序队列中写入若干元素 */
Q.element[0] = 1;
Q.element[1] = 2;
Q.element[2] = 3;
Q.f = &Q.element[0];
Q.r = &Q.element[2];
len = queueLength (&Q);
printf ("queueLength:\t%d\n", len);
getch (); /* 屏幕暂留 */
return 0;
}
![](https://video.ask-data.xyz/img.php?b=https://iknow-pic.cdn.bcebos.com/e824b899a9014c08b90e24f1047b02087bf4f4a9?x-bce-process=image%2Fresize%2Cm_lfit%2Cw_600%2Ch_800%2Climit_1%2Fquality%2Cq_85%2Fformat%2Cf_auto)
追问首先谢谢你的热心回答,然后我有运行了一下第二个人程序,有个错误,你结合下面的图,看看是哪一个错了
![](https://video.ask-data.xyz/img.php?b=https://iknow-pic.cdn.bcebos.com/f11f3a292df5e0fecf888855526034a85fdf72d5?x-bce-process=image%2Fresize%2Cm_lfit%2Cw_600%2Ch_800%2Climit_1%2Fquality%2Cq_85%2Fformat%2Cf_auto)
追答抱歉,原回答确实写错了点儿,已修改
追问谢谢大佬解了我的疑惑!
追答如有问题,可点击头像联系我