8-队列-链式存储

笔记

和顺序存储类似,使用链表来表示队列。入队即是尾插,出队即是头删。

队头即是链表第一个元素,获取队尾就需要遍历next指针找到最后一个节点。

代码

myQueue.c

#include"myQueue.h"
#include"myLinkList.h" //这里使用用户维护指针的链表写法
#include<stdio.h>

//初始化
seqQueue* init_queue(){
    linkListType* link = init_link();
    return (void*)link;
}

//入队
void enqueue(seqQueue queue, void* data){
    if(NULL==queue || NULL==data){
        return;
    }
    linkListType* link = queue;
    insert_link(link, link->m_size, data); //尾插
}

//出队
void dequeue(seqQueue queue){
    if(NULL==queue){
        return;
    }
    linkListType* link = queue;
    remove_link(queue, 0);  //头删
}

//队头
void* front_queue(seqQueue queue){
    if(NULL==queue){
        return NULL;
    }
    linkListType* plist = queue;
    struct linkNode* currNode = plist->head.next;
    return currNode;  //链表的第一个节点
}

//队尾
void* back_queue(seqQueue queue){
    if(NULL==queue){
        return NULL;
    }
    linkListType* plist = queue;
    struct linkNode* currNode = &plist->head;
    for(int i=0;i<plist->m_size;i++){
        currNode = currNode->next;
    }
    return currNode;  //链表的最后一个节点
}


int size_queue(seqQueue queue){
    if(NULL==queue){
        return -1;
    }
    linkListType* plist = queue;
    
    return plist->m_size;
}

void destory_queue(seqQueue queue){
    destory_link(queue);
}

myQueue.h

#ifndef __MY_QUEUE_H
#define __MY_QUEUE_H

typedef void* seqQueue;

seqQueue* init_queue(void);
void enqueue(seqQueue queue, void* data);
void dequeue(seqQueue queue);
void* front_queue(seqQueue queue);
void* back_queue(seqQueue queue);
int size_queue(seqQueue queue);
void destory_queue(seqQueue queue);

#endif

start0.c

测试程序和顺序存储里的基本一致

#include"myQueue.h"
#include<stdio.h>

struct Persion{
    void* next;  //链表不维护指针,需要按约定预留4字节
    char m_name[64];
    int m_age;
};


int main(){
    void* queue = init_queue();

    struct Persion p1 = {NULL,"aaa",10};
    struct Persion p2 = {NULL,"bbb",20};
    struct Persion p3 = {NULL,"ccc",30};
    struct Persion p4 = {NULL,"ddda",40};

    enqueue(queue, &p1);
    enqueue(queue, &p2);
    enqueue(queue, &p3);
    enqueue(queue, &p4);

    while(size_queue(queue) > 0){
        struct Persion* p1 = front_queue(queue);
        printf("front name=%s\tage=%d\n",p1->m_name, p1->m_age);

        struct Persion* p2 = back_queue(queue);
        printf("back  name=%s\tage=%d\n",p2->m_name, p2->m_age);

        dequeue(queue);
        printf("---------\n");
    }

    destory_queue(queue);

    return 0;
}
posted @ 2022-01-25 21:04  WuYunTaXue  阅读(35)  评论(0编辑  收藏  举报