严奶奶版数据结构,我用C写一直报错,后来发现C中没有引用,只有指针。为了还原原版的味道.这里创建了.cpp的文件,加上了#include<cstdio>和#include<cstdlib>两个头文件,来还原原汁原味的严奶奶版数据结构中的算法。
/*循环队列*/
//队的顺序存储结构
#include<cstdio>
#include<cstdlib>
#define QElemType int
#define Status int
#define MAXQSIZE 100//队列的最大长度
typedef struct {
QElemType* base;//初始化动态分配空间
int font;//头指针,若队列不为空则指向队列头元素
int rear;//尾指针,若队列不为空,则指向队尾元素的下一个元素
}SqQueue;
初始化队列
Status InitQueue(SqQueue& Q) {
Q.base = (QElemType*)malloc(MAXQSIZE * sizeof(QElemType));
if (!Q.base) printf("内存空间初始化失败!\n"); exit(OVERFLOW);
Q.font = Q.rear = 0;
printf("循环队列创建成功!\n");
return 0;
}
返回队列长度
Status QueueLength(SqQueue Q) {
return (Q.rear - Q.font + MAXQSIZE) % MAXQSIZE; //MAXQSIZE取模的作用是将尾指针和头指针连接起来
}
插入元素e作为新的队尾元素
Status EnQueue(SqQueue& Q, QElemType e) {
if ((Q.rear + 1) % MAXQSIZE == Q.font) printf("该队列已满!\n"); exit(OVERFLOW);
Q.base[Q.rear] = e;//利用数组代替指针
Q.rear = (Q.rear + 1) % MAXQSIZE;
printf("元素%d插入成功!\n", e);
return 0;
若队列不为空,则排除队头元素,并用e返回其值
Status DeQueue(SqQueue& Q, QElemType e) {
if (Q.font == Q.rear) printf("这是一个空队列!\n"); exit(OVERFLOW);
e = Q.base[Q.font];
Q.font = (Q.font + 1) % MAXQSIZE;
printf("已删除队头元素%d\n", e);
return 0;
}
遍历队列
Status QueueTraverse(SqQueue Q) {
int i;
for (i = Q.font; i < Q.rear; i++) {
printf("%d", Q.base[i]);
}
printf("遍历完成!\n");
return 0;
}
创建新的循环队列
Status CrQueue(SqQueue& Q, int n) {
InitQueue(Q);
int i;
for (i = 0; i < n; i++) {
int e;
scanf_s("请输入第一个元素:%d", &e);
EnQueue(Q,e);
}
printf("新队列创建成功\n");
return 0;
}
获取队头元素
Status GetHead(SqQueue Q, QElemType e) {
if (QueueEmpty(Q)==true) printf("这是一个空队列!\n"); exit(OVERFLOW);
e = Q.base[Q.font];
printf("这个队列的头元素是:%d\n", e);
return 0;
}
判断该队列是否为空
bool QueueEmpty(SqQueue Q) {
if (Q.font == Q.rear) printf("这是一个空队列!\n"); return true;
printf("这不是一个空队列\n");
return false;
}
置空队列
Status ClearQueue(SqQueue Q) {
Q.font == Q.rear;
printf("这个队列置空操作成功!\n");
return 0;
}
销毁这个队列
Status DestotyQueue(SqQueue Q) {
free(Q.base);//销毁栈的连续空间
Q.font = Q.rear = 0;
printf("这个队列销毁成功!\n");
return 0;
}
int main() {
/*此处省略10000字*/
}
main交给各位写了,我实现了没有问题的,有问题的请联系我。
学艺不精,若有错误还请多多指教,谢谢。
p.s.在使用Visual Studio编译器的时候输入scanf()方法要用scanf_s()
更多内容请移步公众号 手撕算法。谢谢
算法爱好者协会群:940100543,加入学习讨论。
所使用编译器为:Visual Studio2019 链接:https://pan.baidu.com/s/1eg8CNrqrP1jn7GRzHfYXxA
提取码:1234
推荐新手使用dev cpp 链接:https://pan.baidu.com/s /1XZp_8lVE7X6tMLmvXRbYhw
提取码:1234