c之队列相关操作------初始化,入队,出队,队列清空,销毁,遍历

来源:互联网 发布:怎样查到淘宝卖家电话 编辑:程序博客网 时间:2024/04/29 19:44
#include <stdio.h>
#include <stdlib.h>
typedef struct QNode{                        ///节点类型
    int data;
    struct QNode *next;
}QNode,*QueuePtr;
typedef struct {                            ///节点指针封装,队列两头的指针
        QueuePtr front;
        QueuePtr rear;
}LinkQueue;                                  ///定义一个结构体,里面的指针是指向节点的指针
//定义一个空队列
void InitQueue(LinkQueue &Q){
    Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
    if(!(Q.front)){
        printf("error");
    }
    Q.front->next=NULL;
    printf("定义成功\n");
}
//队列的初始化
void chushihua(LinkQueue &Q){
    printf("\t写入栈的值\n");
    QueuePtr p;                    //为什么建立的不是一个节点,而是一个指向节点的指针呢
    int e;
    printf("\t请输入元素:(以-1结束)\n");
    scanf("%d",&e);
    while(e!=-1){
        p=(QueuePtr)malloc(sizeof(QNode));
        p->data=e;
        p->next=NULL;
        Q.rear->next=p;
        Q.rear=p;
    scanf("%d",&e);
    }
   QueuePtr q = Q.front->next;
   while(q!=NULL)
   {
      printf("\t%d",q->data);
      q = q->next;
   }
    printf("\n");
}
//元素入队
void EnQueue(LinkQueue &Q,int e){
    QueuePtr p;
    p=(QueuePtr)malloc(sizeof(QNode));
    if(!p)
        printf("error\n");
    p->data=e;
    p->next=NULL;
    Q.rear->next=p;
    Q.rear=p;
}
//元素出队
void DeQueue(LinkQueue &Q,int e){
    QueuePtr p;
     if(!(Q.front==Q.rear)){//判断是不是空队列
        p=Q.front->next;//记录队列中的第二个
        e=p->data;
        Q.front->next=p->next;
        if(Q.rear==p){
            Q.rear=Q.front;
        }
     }
     free(p);
}
//遍历全部队列
void Travertal(LinkQueue &Q){
    QueuePtr p;
    p=Q.front;                        ///理清楚p和front的关系?????????????????????????????????????
    if(p==Q.rear)
        printf("\t空队列,没有可以出队的元素。\n");
    while(!(p==Q.rear)){
        printf("\t%d",p->next->data);
        p=p->next;
    }
    printf("\t遍历完毕\n");
}
//队列销毁
void  DisQueue(LinkQueue &Q){
    while(Q.front){
        Q.rear=Q.front->next;
        free(Q.front);
        Q.front=Q.rear;
    }
    Q.front=Q.rear=NULL;
}
int main()
{


    LinkQueue Q;
    int data;
    int deletedata=0;               ///一个指向节点的指针结构体
    int choice;
    printf("定义一个队列;\n");
    InitQueue(Q);
    printf("***************************\n");
    printf("1.队列初始化\n2.元素入队\n3.元素出队\n4.遍历整个队列\n5.队列置空\n6.销毁队列\n");
    printf("请输入您的选择:\n");
    printf("***************************\n");
    scanf("%d",&choice);
    while(choice!=0){
        switch(choice){
            case 1://初始化队列
                printf("**1.队列的初始化:\n");
                chushihua(Q);
                break;
            case 2://元素入队
                printf("**2.元素入队\n:");
                printf("\t请输入入队的元素的值:");
                scanf("%d",&data);
                EnQueue(Q,data);
                printf(" \t输出入队后的队列:\n");
                Travertal(Q);
                break;
            case 3://元素出队
                printf("**3.元素出队:\n");
                DeQueue(Q,deletedata);
                printf(" \t输出出队后的队列:\n");
                Travertal(Q);
                break;
            case 4://遍历整个队列
                printf("**4.遍历队列:\n");
                Travertal(Q);
                break;
            case 5://队列置空
                printf("**5.队列置空:\n");
                while(Q.front!=Q.rear){
                    DeQueue(Q,deletedata);
                }
                break;
            case 6://销毁队列
                printf("**6.销毁队列:\n");
                DisQueue(Q);
                printf("\t如果还想再次使用队列,请在下一步骤中输入7。\n\t反之,输入0结束程序。");
                break;
            case 7://队列再次初始化
                printf("**7.队列初始化\n");
                InitQueue(Q);
                break;
            }
        printf("请输入下一个选择:\n");
        scanf("%d",&choice);
        }
        if(choice==0)
            printf("\n程序结束,谢谢使用\n");
    return 0;
}



0 0
原创粉丝点击