循环队列和链队列的实现
指针学的好水啊。。为了加深了对指针的运用 循环队列用了指针 链队列用了引用,还有就是在一个地方卡了好久好久,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);
View Code
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;
}
View Code
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;
}
View Code