循环队列和链队列的实现

循环队列和链队列的实现

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

posted @ 2018-04-11 10:42 LesRoad 阅读(...) 评论(...) 编辑 收藏

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值