• 循环队列和链队列的实现


    指针学的好水啊。。为了加深了对指针的运用 循环队列用了指针 链队列用了引用,还有就是在一个地方卡了好久好久,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);
                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
    ", 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);
                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
    ", ans);
                else puts("队列为空");
                break;
            case 10:
                visit2(Q);
                break;
            }
        }
        return 0;
    }
    View Code

    function.cpp

    #include "130h.h"
    using namespace std;
    
    void menu()
    {
        puts("	1.初始化循环队列");
        puts("	2.循环入队");
        puts("	3.循环出队");
        puts("	4.弹出循队队首元素");
        puts("	5.遍历循环队列
    ");
        puts("	6.初始化链队列");
        puts("	7.链队入队");
        puts("	8.链队出队");
        puts("	9.弹出链队队首元素");
        puts("	10.遍历链队列
    ");
    }
    
    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
  • 相关阅读:
    js冒泡排序
    HTML5 canvas 计时器
    centos 6.4安装杀毒软件clamAV 0.98[转]
    PHP大文件下载
    如何在 Eclipse 中使用插件构建 PHP 开发环境[转]
    CentOS 单用户模式:修改Root密码和grub加密[转]
    CentOS 6.0 VNC远程桌面配置[转]
    gprof使用介绍 (gcc -pg) [转]
    VMware NAT端口映射外网访问虚拟机linux
    shell判断文件是否存在[转]
  • 原文地址:https://www.cnblogs.com/lesroad/p/8794265.html
Copyright © 2020-2023  润新知