单链队列的基本操作实现

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


typedef struct Queue {
    int data;
    struct Queue * next;
}Queue;  //队列数据项的组成,数据部分和next指针


typedef struct {
    struct Queue *front;
    struct Queue *rear;
}Linkqueue; //定义一个数据结构队列[限制操作],需要头指针和尾指针

int Init (Linkqueue  &Q){//创建队列,建立一个头节点,易于操作
    Q.front=Q.rear=(Queue *)malloc(sizeof(Queue));
    if (! Q.front ) return -1;
    Q.front->next=NULL;
    return 1;
}

//int Destory (Linkqueue &Q){//销毁队列,不保留头结点即彻底销毁队列
//
//    while (Q.front){
//        Q.rear=Q.front->next;
//        free (Q.front);
//        Q.front=Q.rear;
//     }
//    return 1;
//}
int Destory (Linkqueue &Q){//销毁队列,保留头结点
   Queue *p=Q.front->next;

    while (p){
        Q.rear=p->next;
        free (p);
        p=Q.rear;
     }
      Q.front->next=NULL;
      Q.rear=Q.front;
    return 1;
}
//

int Enqueue (Linkqueue &Q, int e ){//入队
    Queue *p;

    p=(Queue *)malloc(sizeof(Queue));
    if (!p) return 0;
    p->data=e;
    p->next=NULL;
    Q.rear->next=p;
    Q.rear=p;

    return 1;
}

int Dequeue (Linkqueue &Q,int &e){ //出队
    if (Q.front==Q.rear) return 0;
    Queue *p;
    p=Q.front->next;
    e=p->data;
    Q.front->next=p->next;

    if (p==Q.rear) //注意,若仅有一个队列成员,则要将尾指针指向头节点,防止丢失
        Q.rear=Q.front;
    free(p);
    return 1;
}
void show (Linkqueue Q){
   Queue * p;
   p=Q.front->next;
   if (Q.front==Q.rear) {
        printf("空队\n");
   }
   while (p){
        printf("%d ",p->data);
        p=p->next;
   }
   printf("\n");
}
int main()
{
        Linkqueue Q;
        int i,x;
        if (Init(Q))printf("[单链表创建成功]\n");
        printf("1:插入元素到队尾\n2:删除队头元素\n3:销毁队列\n4:展示队列\n0:退出\n");
        while (1){

             scanf("%d",&i);
             switch (i) {
             case 1:
                printf("输入插入元素\n");
                scanf("%d",&x);
                if (Enqueue(Q,x)==1) printf("插入成功\n");
                else printf("插入失败\n");
                break;
             case 2:
                printf("删除队头元素\n");
                 if (Dequeue (Q,x)==1) printf("成功删除%d\n",x);
                 else printf("删除失败\n");
                 break;

             case 3:
                if (Destory ( Q)) printf("销毁成功\n");
                // Init(Q);printf("重置空表\n");
                break;

             case 4:
                show (Q);
                break;

             }
        }
        return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值