一.队列 的特点:(先进先出)
二. 队列使用单链表来实现。
三.老师的代码:有4个文件
1.queue.h
2.queue.c
3.main.c
4.makefile
四.代码:
1.queue.h
#ifndef __QUEUE_H__ #define __QUEUE_H__ #include#include #include #include typedef struct node { void* data; struct node* next; }node,*pnode; typedef struct queue { node* front; node* back; int size; }queue,*pqueue; //初始化 void queue_init(queue* q); // 入队列 int queue_push(queue* q,const void* data,int size); //出队列 int queue_pop(queue* p); //查询数据(查头) void* queue_find_front(queue* q); //查询数据(查尾) void* queue_find_back(queue* q); //查看队列大小 int queue_size(queue* q); //销毁队列 void queue_destroy(queue* q); //判断队列是否为空 bool queue_empty(queue* q); #endif
queue.c
#include "queue.h"
//初始化
void queue_init(queue* q)
{
if(!q)
{
return ;
}
q->size = 0;
q->back=NULL;
q->front = NULL;
}
// 入队列
int queue_push(queue* q,const void* data_ptr,int size)
{
//第一步:判断指针是否为NULL
if(q == NULL || data_ptr == NULL|| size <0)
{
return -1;
}
//第二步:申请新节点
node* p = (node*)malloc(sizeof(node));
if(!p )
{
return -2;
}
p->data = malloc(size);
if(p->data == NULL)
{
return -2;
}
//第三步:数据赋值
memcpy(p->data,data_ptr,size);
//连接到最后一个节点
if(q->size == 0)
{
q->back = p;
q->front = p;
}
else
{
q->back->next = p;
q->back = p;
}
//第四步:队列个数加一
q->size++;
return 0;
}
//出队列
int queue_pop(queue* q)
{
if (!q || q->size <= 0)
{
return -1;
}
node* ptmep = q->front;
free(ptmep->data);
free(ptmep);
q->front = q->front->next;
q->size--;
if(q->size == 0)
{
q->front = NULL;
q->back = NULL;
}
}
//查询数据(查头)
void* queue_find_front(queue* q)
{
if(q == NULL)
{
return -1;
}
if(q->size ==0)
{
return NULL;
}
return q->front->data;
}
//查询数据(查尾)
void* queue_find_back(queue* q)
{
if(q == NULL)
{
return -1;
}
if(q->size ==0)
{
return NULL;
}
return q->back->data;
}
//查看队列大小
int queue_size(queue* q)
{
if(q == NULL)
{
return -1;
}
return q->size;
}
//销毁队列
void queue_destroy(queue* q)
{
if(q == NULL)
{
return ;
}
if(q->size ==0)
{
return ;
}
while (q->size)
{
queue_pop(q);
}
}
//判断队列是否为空
bool queue_empty(queue* q)
{
if(q == NULL)
{
return true;
}
if(q->size ==0)
{
return true;
}
return false;
}
main.c
#include "queue.h"
queue q;
int main(int argc,char* argv[])
{
queue_init(&q);
for(int i = 0; i < 10;i++)
{
queue_push(&q,&i,sizeof(int));
}
printf("首元素:%dn",*(int*)queue_find_front(&q));
printf("尾元素:%dn",*(int*)queue_find_back(&q));
printf("元素个数%dn",queue_size(&q));
for(int i = 0; i < 5;++i)
{
queue_pop(&q);
printf("首元素%d:%dn",i+1,*(int*)queue_find_front(&q));
}
queue_destroy(&q);
if(queue_empty(&q))
{
printf("队列为nulln");
}
return 0;
}
makefile
QUEUE : main.o queue.o gcc -g main.o queue.o -o QUEUE main.o : main.c gcc -g -c main.c -o main.o queue.o : queue.c gcc -g -c queue.c -o queue.o clean: rm *.o exe: rm QUEUE
自己写的代码:(4个文件)
1.day04.h
#ifndef __DAY04_H__ #define __DAY04_H__ #include#include #include #include #include #include typedef struct node //节点空间 { void* data; struct node* next; }node,*pnode; typedef struct queue //首尾的指针 { node* front;//头指针 node* back; //尾指针 int size; //数据的多少 }queue,*pqueue; void queue_init(queue* q); //初始化 int queue_push(queue*q ,const void *data_ptr,int size); //入队列 int queue_pop(queue* q); //出队列 void* queue_find_front(queue* q);//查询数据(头部) void* queue_find_back(queue* q);//查询数据(尾部) int queue_size(queue *q ); //查看队列的大小 void queue_destroy(queue* q); //销毁队列 bool queue_empty(queue* q);// 判断队列是否为空 #endif
day04.c
#include#include #include #include #include #include #include "day04.h" void queue_init(queue* q)//初始化 { if(!q) { return; } q->size=0; q->front=NULL; q->back=NULL; } int queue_push(queue*q ,const void *data_ptr,int size) //入队列 { //判断指针是否为空 if(q==NULL||data_ptr ==NULL || size <0) { printf("参数错误!n"); return -1; } node * p = (node* )malloc(sizeof(node)); if(p==NULL) { printf("开辟节点失败!n"); return -2; } p->data= malloc(size); if(p->data==NULL) { printf("数据空间开辟失败n"); return -3; } memcpy(p->data,data_ptr,size); //q->back=p; if(q->size==0) //开始没有节点 所以只有头尾指针都在一个数据上 { q->back=p; q->front=p; } else { q->back->next=p; q->back=p; } (q->size)++; return 1; } int queue_pop(queue* q) //出队列 { if(q==NULL) { printf("参数传递错误!n"); return -1; } if(q->size==0) { printf("队列元素为空!n"); return -2; } node* pp=q->front; q->front=q->front->next; //q->front=pp->next; --(q->size); free(pp->data); free(pp); if(q->size==0) //防止尾部的标记位 指向 不存在的空间 从而报错! { q->back=NULL; } return 1; } void* queue_find_front(queue* q)//查询数据(头部) { if(q==NULL) { printf("参数传输错误!n"); return NULL; } else if(q->size==0) { printf("队列元素为空!n"); return NULL; } return q->front->data; } void* queue_find_back(queue* q)//查询数据(尾部) { if(q==NULL) { printf("参数传输错误!n"); return NULL; } if(q->size==0) { printf("队列元素为空!n"); return NULL; } return q->back->data; } int queue_size(queue *q ) //查看队列的大小 { if(q==NULL) { printf("参数传输错误!n"); return -1; } return q->size; } void queue_destroy(queue* q) //销毁队列 { while(q->size!=0) { queue_pop(q); } return; } bool queue_empty(queue* q)// 判断队列是否为空 { if(q==NULL) { printf("参数传输错误!n"); return true; } else if(q->size==0) { return true; } else { return false; } }
main.c
#include#include #include #include #include #include #include "day04.h" queue q; int main(int argc, char *argv[]) { queue_init(&q); int m,i; for (i = 0; i < 10; i++) { m = queue_push(&q, &i, sizeof(int)); printf("m=%dn", m); } printf("首元素%dn", *(int *)queue_find_front(&q)); printf("尾部元素:%dn", *(int *)queue_find_back(&q)); printf("元素个数:%dn", queue_size(&q)); for(i=0;i<5;i++) { m = queue_pop(&q); printf("m=%dn", m); printf("===================n"); printf("元素个数:%dn", queue_size(&q)); printf("+++++++++++++++++++++n"); } queue_destroy(&q); if(queue_empty(&q)) { printf("空了n"); } else { printf("没空了n"); } return 0; }
makedfile
queue : main.o day04.o gcc -g -o queue main.o day04.o main.o:main.c gcc -g -c main.c -o main.o day04.o: day04.c gcc -g -c day04.c -o day04.o



