C语言实现链队列并测试

13 篇文章 2 订阅

采用链式存储法编程实现元素入队、出队以及将队列中的元素显示出来,要求整个过程以菜单选择的形式出现。队列的链式存储结构是通过节点构成的单链表实现的,此时只允许在单链表的表首进行删除,在表尾进行插入,以实现队列先进先出的特点,因此需要使用两个指针,用 front 指向队首节点存储位置,用 rear 指向队尾节点存储位置。

IDE:Code::Blocks 17.12

Compiler:GNU GCC Compiler

/*链队列的实现及测试*/
#include <stdio.h>
#include <stdlib.h>
#define ElemType int

//定义链队列的结构体
typedef struct node{
    ElemType data; //存放元素内容
    struct node * next; //指向下一个节点
}quenode;

struct quefr{
    quenode * front,*rear; //队首队尾指针
};


//初始化链队列
void creat(struct quefr * q){
    quenode * h;
    h=(quenode *)malloc(sizeof(quenode));
    h->next=NULL;
    q->front=h;  //队首指针指向头节点
    q->rear=h;  //队尾指针指向头节点
}

//函数enque()实现元素x入队
void enque(struct quefr * q,ElemType x){
    quenode * s;
    s=(quenode *)malloc(sizeof(quenode));
    s->data=x;
    s->next=NULL;
    q->rear->next=s;
    q->rear=s;  //队尾指向s节点
}

//函数deque()实现元素出队
ElemType deque(struct quefr * q){
    quenode * p;
    p=(quenode *)malloc(sizeof(quenode));
    ElemType x;
    if(q->front == q->rear){ //队列为空
        printf("queue is NULL \n");
        x=0;
    }else{
        p=q->front->next;
        q->front->next=p->next;  //取下队列首元素p
        if(p->next==NULL){  //取下元素后队列中无元素
            q->rear=q->front;  //队首和队尾指针指向同一个地方,队列为空
        }
        x=p->data;
        free(p);
    }
    return x;
}


//函数display()显示队列中的元素
void display(struct quefr dq){
    quenode * p;
    p=(quenode *)malloc(sizeof(quenode));
    p=dq.front->next;
    while(p!=NULL){
        printf("data=%d \n",p->data);
        p=p->next;
    }
    printf("------------------------------\n");
}

int main()
{
    struct quefr * que;
    int n,i,x,sel;
    do{
        printf("------------------------------\n");
        printf("    1   创建队列    \n");
        printf("    2   向队列中插入元素    \n");
        printf("    3   从队列中删除元素    \n");
        printf("    4   显示队列中的元素    \n");
        printf("    5   退出  \n");
        printf("------------------------------\n");
        printf("请选择(1,2,3,4,5):");
        scanf("%d",&sel);
        switch(sel){
        case 1:
            que=(struct quefr *)malloc(sizeof(struct quefr));
            creat(que);
            printf("请输入元素个数:");
            scanf("%d",&n);
            for(i=1;i<=n;++i){
                scanf("%d",&x);
                enque(que,x);
            }
            printf("创建成功!\n");
            break;
        case 2:
            printf("输入您想插入队列的元素:");
            scanf("%d",&x);
            enque(que,x);
            printf("插入队列成功!\n");
            break;
        case 3:
            printf("出队元素为:");
            printf("x=%d\n",deque(que));
            printf("出队成功!\n");
            break;
        case 4:
            display(*que);
            break;
        case 5:
            exit(0);
        }
    }while(sel<=4);
    return 0;
}


------一分耕耘,一分收获------
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值