循环队列和链队列的实现
指针学的好水啊。。为了加深了对指针的运用 循环队列用了指针 链队列用了引用,还有就是在一个地方卡了好久好久,20多个报错无法编译通过要不要这么狠哇。。。最后发现是case内定义了新的变量惹
case里最好不要定义新的变量,否则会出现error:jump to case label,解决办法让case加上花括号或者变量的定义写在switch外边
以下是测试代码,,
头文件"130h.h"
#include <bits/stdc++.h> #define N 10 const int inf = 0x3f3f3f3f; struct node1 { int f, r, *a, num; }; struct node { int data; node *next; }; struct node2 { node *f, *r; }; void menu(); bool init1(node1 *&q); bool push1(node1 *q, int x); bool pop1(node1 *q); int front1(node1 *q); void visit1(node1 *q); bool init2(node2 &q); bool push2(node2 &q, int x); bool pop2(node2 &q); int front2(node2 q); void visit2(node2 q);
main.cpp
#include "130h.h" using namespace std; int main() { int n, x, m, ans, i; node1 *q; node2 Q; while(1) { menu(); puts("请输入操作, -1结束"); cin>>m; if(m==-1) break; switch(m) { case 1: if(init1(q)) puts("初始化成功"); else puts("初始化失败"); break; case 2: puts("请输入入队个数"); cin>>n; printf("请输入%d个元素\n", n); for(i = 1; i <= n; i++) { cin>>x; if(!push1(q, x)) { puts("队列已满!"); break; } } if(i == n+1) puts("入队成功"); break; case 3: puts("请输入出队个数"); cin>>n; for(i = 1; i <= n; i++) { if(!pop1(q)) { puts("队列已空!"); break; } } if(i == n+1) puts("出队成功"); break; case 4: ans = front1(q); if(ans != inf) printf("队首元素为%d\n", ans); else puts("队列为空"); break; case 5: visit1(q); break; case 6: if(init2(Q)) puts("初始化成功"); else puts("初始化失败"); break; case 7: puts("请输入入队个数"); cin>>n; printf("请输入%d个元素\n", n); for(i = 1; i <= n; i++) { cin>>x; if(!push2(Q, x)) { puts("队列已满!"); break; } } if(i == n+1) puts("入队成功"); break; case 8: puts("请输入出队个数"); cin>>n; for(i = 1; i <= n; i++) { if(!pop2(Q)) { puts("队列已空!"); break; } } if(i == n+1) puts("出队成功"); break; case 9: ans = front2(Q); if(ans != inf) printf("队首元素为%d\n", ans); else puts("队列为空"); break; case 10: visit2(Q); break; } } return 0; }
function.cpp
#include "130h.h" using namespace std; void menu() { puts("\t1.初始化循环队列"); puts("\t2.循环入队"); puts("\t3.循环出队"); puts("\t4.弹出循队队首元素"); puts("\t5.遍历循环队列\n"); puts("\t6.初始化链队列"); puts("\t7.链队入队"); puts("\t8.链队出队"); puts("\t9.弹出链队队首元素"); puts("\t10.遍历链队列\n"); } bool init1(node1 *&q)//初始化循环队列 { q = (node1*)malloc(sizeof(node1));//指针q重新初始化需要引用才能对main产生影响 q->a = (int*)malloc(N*sizeof(int));//指针q的指向发生变化不需要引用就能对main产生影响 if(!q || !q->a) return 0; q->r = q->f = q->num = 0; return 1; } bool push1(node1 *q, int x)//循环入队 { if(q->r == q->f && q->num == N) return 0; q->a[q->r] = x; q->r = (q->r+1)%N; q->num++; return 1; } bool pop1(node1 *q)//循环出队 { if(q->r == q->f && !q->num) return 0; q->f = (q->f+1)%N; q->num--; return 1; } int front1(node1 *q)//弹出循队队首元素 { if(q->r == q->f && !q->num) return inf; return q->a[q->f]; } void visit1(node1 *q)//遍历循环队列 { int p = q->f, n = q->num; if(!n) puts("队列为空"); while(n) { printf("%d ", q->a[p]); p = (p+1) % N; n--; } cout<<endl; } bool init2(node2 &q)//初始化链队列 { q.f = (node*)malloc(sizeof(node)); if(!q.f) return 0; q.r = q.f; q.r->next = NULL; return 1; } bool push2(node2 &q, int x)//链队入队 { node *p; p = (node*)malloc(sizeof(node)); if(!p) return 0; p->data = x; p->next = q.r->next; q.r->next = p; q.r = p; return 1; } bool pop2(node2 &q)//链队出队 { if(q.r == q.f) return 0; node *p; p = q.f; q.f = p->next; free(p); return 1; } int front2(node2 q)//弹出链队队首元素 { if(q.f == q.r) return inf; return q.f->next->data; } void visit2(node2 q)//遍历链队列 { node *p; p = q.f; if(p == q.r) puts("队列为空"); while(p != q.r) { printf("%d ", p->next->data); p = p->next; } cout<<endl; }