首页 » Program » C/C++ » 正文

链队列

链队列带有头结点(不存数值,只为方便操作),队尾指针存有元素,这里我实现了链队列的初始化,插入,删除,销毁操作

    #include <stdio.h>
    #include <stdlib.h>

    typedef struct Qnode
    {
        int data;
        struct Qnode *next;
    } Qnode,*Qptr;

    typedef struct
    {
        Qptr f;
        Qptr r;
    } linkqueue;

    int initqueue(linkqueue &Q)   //初始化队列
    {
        Q.f = Q.r = (Qptr)malloc(sizeof(Qnode));   //动态分配空间,队头和队尾指针要指向同一个地址
        if (Q.f) return 0;
        Q.f->next = NULL;
        return 1;
    }

    int ins(linkqueue &Q,int e)
    {
        Qptr p;
        p = (Qptr)malloc(sizeof(Qnode));  //生成结点
        if (!p) return 0;
        p->data = e;   //尾插
        p->next = NULL;
        Q.r->next = p;
        Q.r = p;   //更新尾结点
        return 1;
    }

    int del(linkqueue &Q)
    {
        Qptr p;
        int e;
        if (Q.f==Q.r) return 0;  //判空
        p = Q.f->next;
        e = p->data;
        Q.f->next = p->next;
        if (Q.r==p) Q.r = Q.f;  //如果队列就一个尾结点,删掉就空了
        free(p);
        return e;
    }

    void destroy(linkqueue &Q)
    {
        while (Q.f)
            {
                Q.r = Q.f->next;
                free(Q.f);
                Q.f = Q.r;
            }
        printf("链队列销毁完毕!\n");
    }

    void printqueue(linkqueue Q)
    {
        Qptr p;
        p = Q.f;
        printf("此时链队列中的元素为:\n");
        while (p->next)
            {
                printf("%d ",p->next->data);
                p = p->next;
            }
    }

    int main()
    {
        int x,m;
        linkqueue Q;
        initqueue(Q);
        printf("请输入插入到链队列中的元素值\n");
        while (scanf("%d",&x)!=EOF)
            {
                ins(Q,x);
            }
        printqueue(Q);
        printf("\n删除队头元素\n");
        m = del(Q);
        printf("删除的元素是%d\n",m);
        printqueue(Q);
        return 0;
    }


赞 (0)

Comment