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