队列定义:队列简称队。是一种操作受限的线性表,只允许在表的一端进行插入,而在表的另一端进行删除。向队列中插入元素称为入队或进队;删除元素称为出队或离队。其操作特性为先进先出(First In First Out,FIFO),并且只允许在队尾进,队头出。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct linknode
{
struct linknode* next;
void* data;
};
struct linkqueue
{
struct linknode* start;
struct linknode* end;
int size;
};
//初始化
struct linkqueue* init_queue()
{
struct linkqueue* myqueue=(struct linkqueue*)malloc(sizeof(struct linkqueue));
if(myqueue==NULL)
{
return NULL;
}
myqueue->end = NULL;
myqueue->start = NULL;
myqueue->size = 0;
return myqueue;
}
//入队
void insetnode(struct linkqueue* myqueue, void* data)
{
if(myqueue==NULL||data==NULL)
return NULL;
struct linknode* node = (struct linknode*)malloc(sizeof(struct linknode));
if(node==NULL)
return;
node->data = data;
node->next = NULL;
if (myqueue->end == NULL && myqueue->start == NULL)
{
myqueue->start = node;
myqueue->end = node;
myqueue->size++;
}
else
{
myqueue->end->next = node;
myqueue->end = node;
myqueue->size++;
}
}
//出队
void dele(struct linkqueue* myqueue)
{
if(myqueue==NULL)
return ;
struct linknode* node = myqueue->start;
myqueue->start=myqueue->start->next;
free(node);
myqueue->size--;
node = NULL;
}
void show_all(struct linkqueue* myqueue, void(* myprintf)(void*data))
{
if(myqueue==NULL&&myprintf==NULL)
return ;
struct linknode* node = myqueue->start;
while (node != NULL)
{
myprintf(node->data);
node = node->next;
}
}
//销毁
void freequeue(struct linkqueue* myqueue)
{
struct linknode* node = myqueue->start;
while (node!= NULL)
{
myqueue->start = node->next;
free(node);
node = myqueue->start;
}
free(myqueue);
}
void myprintf(void* data)
{
int a = *(int*)data;
printf("%d\n", a);
}
test01()
{
struct linkqueue* myqueue = init_queue();
int a[20] = { 0 };
for (int i = 0; i < 10; i++)
{
//int data = i + 1;
a[i] = i + 1;
insetnode(myqueue, (void*)(a+i));
}
show_all(myqueue,myprintf);
printf("%d\n", myqueue->size);
dele(myqueue);
show_all(myqueue, myprintf);
printf("%d\n", myqueue->size);
freequeue(myqueue);
//printf("%d\n", myqueue->size);
}
int main()
{
test01();
return 0;
}