C语言实现链式队列的操作

头文件部分(.h文件)


#ifndef __LINKQUEUE_H__  // 条件编译,防止重复包含头文件
#define __LINKQUEUE_H__
 
typedef int dataType;  // 定义一个名为dataType的类型别名,代表整型数据

union msg {  // 定义一个联合体msg
    dataType data;  // 联合体成员1: data,类型为dataType
    int len;  // 联合体成员2: len,类型为int
};

typedef struct node {  // 定义一个名为node的结构体
    union msg text;  // 结构体成员1: text,类型为union msg
    struct node* next;  // 结构体成员2: next,类型为指向node的指针
} linkQueue;

typedef struct {  // 定义一个名为linkPos的结构体
    linkQueue* front;  // 结构体成员1: front,类型为指向linkQueue的指针
    linkQueue* rear;  // 结构体成员2: rear,类型为指向linkQueue的指针
} linkPos;


void initQueue(linkPos* q);  // 初始化链式队列函数声明


int isEmpty(linkPos* q);  // 判断链式队列是否为空函数声明


void enQueue(linkPos* q, dataType data);  // 入队函数声明


void deQueue(linkPos* q);  // 出队函数声明


dataType getFront(linkPos* q);  // 获取队列头元素函数声明


void clearQueue(linkPos* q);  // 清空队列函数声明


void printQueue(linkPos* q);  // 打印链式队列元素函数声明


#endif

func函数部分(.c文件)(主要部分)

// 初始化链式队列
void initQueue(linkPos* q) {
    q->front = NULL;
    q->rear = NULL;
}

// 判断链式队列是否为空
int isEmpty(linkPos* q) {
    return (q->front == NULL);
}

// 入队
void enQueue(linkPos* q, dataType data) {
    linkQueue* newQueue = (linkQueue*)malloc(sizeof(linkQueue));
    newQueue->text.data = data;
    newQueue->next = NULL;

    if (isEmpty(q)) {
        q->front = newQueue;
        q->rear = newQueue;
    } else {
        q->rear->next = newQueue;
        q->rear = newQueue;
    }
}

// 出队
void deQueue(linkPos* q) {
    if (isEmpty(q)) {
        printf("队列为空\n");
    } else {
        linkQueue* temp = q->front;
        q->front = q->front->next;

        free(temp);

        if (q->front == NULL) {
            q->rear = NULL;
        }
    }
}

// 获取队列头元素
dataType getFront(linkPos* q) {
    if (isEmpty(q)) {
        printf("队列为空\n");
        return 0;
    } else {
        return q->front->text.data;
    }
}

// 清空队列
void clearQueue(linkPos* q) {
    while (!isEmpty(q)) {
        deQueue(q);
    }
}

// 打印链式队列元素
void printQueue(linkPos* q) {
    if (isEmpty(q)) {
        printf("队列为空\n");
        return;
    }

    linkQueue* current = q->front;
    while (current != NULL) {
        printf("%d ", current->text.data);
        current = current->next;
    }
    printf("\n");
}

main函数部分(.c文件)

int main(int argc, const char *argv[])
{
    linkPos queue;
    initQueue(&queue);

    // 入队操作
    enQueue(&queue, 10);
    enQueue(&queue, 20);
    enQueue(&queue, 30);

    // 打印队列
    printf("当前队列元素:");
    printQueue(&queue);  // 输出:10 20 30

    // 出队操作
    deQueue(&queue);

    // 打印队列
    printf("当前队列元素:");
    printQueue(&queue);  // 输出:20 30

    // 获取队列头元素
    printf("队列头元素:%d\n", getFront(&queue));  // 输出:20

    // 清空队列
    clearQueue(&queue);

    // 打印队列
    printf("当前队列元素:");
    printQueue(&queue);  // 输出:队列为空

    return 0;
}

代码运行结果

当前队列元素:10 20 30 
当前队列元素:20 30 
队列头元素:20
当前队列元素:队列为空
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值