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;
}


------一分耕耘,一分收获------
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
链队列是一种特殊的链表,它只能在队列的两端进行插入和删除操作。下面是用C语言实现链队列的初始化、入队出队等操作的示例代码: ``` #include <stdio.h> #include <stdlib.h> // 链队列结点结构体 typedef struct QueueNode { int data; struct QueueNode *next; } QueueNode; // 链队列结构体 typedef struct { QueueNode *front; // 队头指针 QueueNode *rear; // 队尾指针 } LinkQueue; // 初始化链队列 void InitQueue(LinkQueue *q) { q->front = q->rear = (QueueNode *)malloc(sizeof(QueueNode)); // 创建头结点 if (!q->front) { // 内存分配失败 exit(-1); } q->front->next = NULL; // 头结点的next指针为空 } // 判断链队列是否为空 int IsEmpty(LinkQueue *q) { return q->front == q->rear; } // 入队操作 void EnQueue(LinkQueue *q, int x) { QueueNode *s = (QueueNode *)malloc(sizeof(QueueNode)); if (!s) { // 内存分配失败 exit(-1); } s->data = x; s->next = NULL; q->rear->next = s; // 将s插入到队尾 q->rear = s; // 修改队尾指针 } // 出队操作 int DeQueue(LinkQueue *q) { if (IsEmpty(q)) { // 队列为空 printf("Queue is empty!\n"); exit(-1); } QueueNode *p = q->front->next; int x = p->data; q->front->next = p->next; // 修改队头指针 if (q->rear == p) { // 如果队列只有一个元素,删除后将队尾指针置为头结点 q->rear = q->front; } free(p); // 释放结点p的空间 return x; } // 输出链队列中的所有元素 void PrintQueue(LinkQueue *q) { QueueNode *p = q->front->next; while (p != NULL) { printf("%d ", p->data); p = p->next; } printf("\n"); } // 主函数测试链队列操作 int main() { LinkQueue q; InitQueue(&q); EnQueue(&q, 1); EnQueue(&q, 2); EnQueue(&q, 3); printf("出队元素:%d\n", DeQueue(&q)); printf("出队元素:%d\n", DeQueue(&q)); printf("出队元素:%d\n", DeQueue(&q)); EnQueue(&q, 4); EnQueue(&q, 5); PrintQueue(&q); } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值