数据结构学习之队列(C语言)

#数据结构学习之队列(C语言)

队列( queue)也是存放数据对象的一种容器,其中的数据对象也按线性的逻辑次序排列。队列结构同样支持对象的插入和删除,但两种操作的范围分别被限制于队列的两端,若约定新对象只能从某一端插入其中,则只能从另一端删除已有的元素。允许取出元素的一端称作队头( front),而允许插入元素的另一端称作队尾( rear)。队列中各对象的操作次序遵循所谓先进先(first-in-first-out, FIFO)的规律:更早(晚)出队的元素应为更早(晚)入队者,反之,更早(晚)入队者应更早(晚)出队。

在一个队列结构中,有三个元素,分别是头指针,尾指针以及表示队列中当前成员个数的参数

typedef struct
{
    Qnodetype* front; /*头指针*/
    Qnodetype* rear; /*尾指针*/
    int num; /*短消息数量*/
}Queue;

队列中的成员采取链式存储结构。

typedef struct Qnode
{
    char data[MaxMessage];
    struct Qnode* next;
}Qnodetype;

队列设置有以下接口:

int initQueue(Queue **q);           /*初始化队列*/
int enQueue(Queue* q, char x[]);    /*进队操作*/
int sizeofQueue(Queue* q);          /*队列大小*/
int outQueue(Queue* q,char x[]);    /*出队操作*/
void get(Queue* q, char x[]);       /*获取成员*/
int delAll(Queue* q);               /*删除所有队列成员*/
int delOne(Queue* q,int num);       /*删除指定成员(按序号)*/
int displayAll(Queue* q);           /*显示所有成员*/
int displayOne(Queue* q,int num);   /*显示一个成员(按序号)*/

具体代码如下:

Queue.h

#pragma once

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

#define MaxMessage 50 /*消息最大长度*/
#define LEN 3 /*队列最大长度*/
#define MALLOC_QNODE (Qnodetype*)malloc(sizeof(Qnodetype))

/*成员结构*/
typedef struct Qnode
{
    char data[MaxMessage];
    struct Qnode* next;
}Qnodetype;

/*定义队列*/
typedef struct
{
    Qnodetype* front; /*头指针*/
    Qnodetype* rear; /*尾指针*/
    int num; /*短消息数量*/
}Queue;

int initQueue(Queue **q);
int enQueue(Queue* q, char x[]);
int sizeofQueue(Queue* q);
int outQueue(Queue* q,char x[]);
void get(Queue* q, char x[]);
int delAll(Queue* q);
int delOne(Queue* q,int num);
int displayAll(Queue* q);
int displayOne(Queue* q,int num);

Queue.c

#include "Queue.h"

/*初始化队列*/
int initQueue(Queue **q)
{
    Qnodetype* node = NULL;
    *q = (Queue*)malloc(sizeof(Queue));
    node = MALLOC_QNODE;
    if ((*q) == NULL || node == NULL) return 0;
    (*q)->front = node;
    (*q)->rear = (*q)->front;
    (*q)->front->next = NULL;
    (*q)->num = 0;
    return 1;
}

/*进队操作*/
int enQueue(Queue* q, char x[])
{
    Qnodetype* node = NULL;
    node = MALLOC_QNODE;
    int i = 0;
    while (i < MaxMessage)
    {
        node->data[i] = x[i];
        i++;
    }
    node->next = NULL;
    q->rear->next = node;
    q->rear = node;
    (q->num)++;
    return 1;
}

/*队列大小*/
int sizeofQueue(Queue* q)
{ 
    if(q!=NULL)
        return (q->num);
}
/*出队操作*/
int outQueue(Queue* q,char x[])
{
    Qnodetype* delnode = NULL;
    int i = 0;
    delnode = q->front->next;
    //while (i < MaxMessage)
    //{
    //	//x[i] = delnode->data[i];
    //	//x[i] = 'x';
    //	i++;
    //}
    q->front->next = delnode->next;
    if (q->rear == delnode) q->front = q->rear;
    (q->num)--;
    
    printf("\n\t\t\t\t\t\t\tMsg: %s is outQueue!\n\n", delnode->data);
    free(delnode);

    return 1;
}

/*获取成员*/
void get(Queue* q, char x[])
{
    char* s = NULL;
    if (q->num < LEN)
        enQueue(q, x);
    else
    {
        outQueue(q, s);
        enQueue(q, x);
    }
}

/*删除所有队列成员*/
int delAll(Queue* q)
{
    //Qnodetype* node = NULL;
    char* s = NULL;
    //node = q->front->next;
    while (q->front != q->rear)
    {
        if (outQueue(q, s));
        else return 0;
    }
    return 1;
}

/*删除指定成员(按序号)*/
int delOne(Queue* q,int num)
{
    int i = 0;
    Qnodetype* node = NULL, * node_t = NULL;
    node = node_t = q->front;
    if ((q->num) >= num)
    {
        for (i = 0; i < (q->num); i++)
        {
            if (i == num - 1)
            {
                node_t = node->next;
                node->next = node_t->next;
                printf("\t\t\t\t\t\tDeleting Msg No.%d: %s\n", num, node_t->data);
                free(node_t);
            }
            else
            {
                node = node->next;
                if (node == NULL)return 0;
            }
        }
    }
    else return 0;
    return 1;
}

/*显示所有成员*/
int displayAll(Queue* q)
{
    int i = 0;
    Qnodetype* node = NULL;
    node = q->front->next;
    if (q->num == 0)
    {
        printf("\t\t\t\t\t\t\tQueue is empty!\n");
        return 1;
    }
    while (i <= q->num)
    {
        printf("\t\t\t\t\t\t\tMsg No.%d: %s\n", i, node->data);
        node = node->next;
        if (node == NULL) return 0;
        i++;
    }
    return 1;
}

/*显示一个成员(按序号)*/
int displayOne(Queue* q,int num)
{
    int i = 0;
    Qnodetype* node = NULL;
    node = q->front;
    if (q->num == 0)
    {
        printf("\t\t\t\t\t\tQueue is empty!\n");
        return 1;
    }
    while (i <= q->num)
    {
        if (i == num)
        {
            printf("\t\t\t\t\t\tMsg No.%d: %s\n", num, node->data);
            break;
        }
        else
        {
            node = node->next;
            if (node == NULL) return 0;
        }
        i++;
    }
    return 1;
}

/*主函数*/
int main(void)
{
    Queue* q = NULL;
    Qnodetype* node_h = NULL;
    int i = 0;;
    char command = 0;
    char str[MaxMessage] ="";
    initQueue(&q);
    node_h = q->front;

    while (1)
    {
        printf("Get information(%d),please enter R/r\n", q->num);
        printf("Display one information(%d),please enter L/l\n", q->num);
        printf("Display all information(%d),please enter A/a\n", q->num);
        printf("Delete one information(%d),please enter D/d\n", q->num);
        printf("Delete all information(%d),please enter U/u\n", q->num);
        printf("Quit,please enter Q/q\n");
        printf("please input command:\n");
        //getchar();
        scanf_s("%c", &command);
        switch (command)
        {
        case 'r':
        case 'R':
            getchar();
            gets(str);
            //scanf_s("%s",&str);
            q->front = node_h;
            get(q, str);
            break;
        case 'l':
        case 'L':
            printf("enter No.:");
            scanf_s("%d", &i);
            q->front = node_h;
            displayOne(q, i);
            getchar();
            break;
        case 'a':
        case 'A':
            q->front = node_h;
            displayAll(q);
            getchar();
            break;
        case 'd':
        case 'D':
            printf("enter No.:");
            scanf_s("%d", &i);
            q->front = node_h;
            delOne(q, i);
            getchar();
            break;
        case 'u':
        case 'U':
            q->front = node_h;
            delAll(q);
            getchar();
            break;
        case 'q':
        case 'Q':
            printf("quit!!!\n");
            Sleep(1000*3);
        }
        if (command == 'q' || command == 'Q')
            break;
    }
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值