有一个具有n个单元的循环队列,设头指针为f,为指针为r,编写一个自定义函数,求队列中元素的个数 (求帮忙)

#include <stdio.h>
#define n 20
typedef int elementtype;
typedef struct{
elementtype element[n];
int f,r;
}CQueue;

题主这队列的定义也不太对啊。给题主一份完整的队列操作代码吧。

#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;
}

以上是“链队列”代码,如果题主想要“顺序队列”的话,以下就只写出定义和求长度部分了

#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;
}

追问

首先谢谢你的热心回答,然后我有运行了一下第二个人程序,有个错误,你结合下面的图,看看是哪一个错了

追答

抱歉,原回答确实写错了点儿,已修改

追问

谢谢大佬解了我的疑惑!

追答

如有问题,可点击头像联系我

温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-04-22

你需要的可能是这样的网页链接

第2个回答  2019-04-21
沉迷于玩手机会使孩子变得越来越孤僻,不愿与外界交往,性格也越来越怪异,整日沉迷在网络虚玄世界,迷迷忽忽,很容易诱发他们自闭症、孤独症等心理疾病;还会出现过度依赖网络症,导致注意力、记忆力下降,导致抑郁、焦虑等情绪问题。追问

这位网友你好,请你看看问题再回答好吗?

相似回答