链队列的基本操作:
和顺序表队列差不多啊,都队头出,队尾入,操作也没有什么难度昂,简简单单。
#include <stdio.h>
#include <stdlib.h>
typedef struct Element{ //同样的先定义数据域的类型
int id;
char name[250];
}Element;
typedef struct Node{ //定义节点
Element data; //数据域
struct Node* next; //指针域
}QueueNode;
typedef struct Linkqueue{ //定义队列
QueueNode* front; //队头
QueueNode* rear; //队尾
int length; //队列长度
}Linkqueue;
Element datas[] ={
{1,"大帅比1"},
{2,"大帅比2"},
{3,"大帅比3"},
};
//初始化队列
void InitLinkqueue(Linkqueue* linkqueue);
//入队操作
void Pushlinkqueue(Linkqueue* linkqueue,Element data);
//出队操作
void Poplinkqueue(Linkqueue* linkqueue);
//打印队列
void Printlinkqueue(Linkqueue* linkqueue);
int main(void)
{
Linkqueue linkqueue; //创建一个链队列
InitLinkqueue(&linkqueue); //初始化链队列
int i;
for(i=0;i<3;i++)
{
Pushlinkqueue(&linkqueue,datas[i]); //入队操作
}
Printlinkqueue(&linkqueue); //打印队列
Poplinkqueue(&linkqueue); //出队操作
Printlinkqueue(&linkqueue); //打印队列
return 0;
}
//初始化队列
void InitLinkqueue(Linkqueue* linkqueue)
{
linkqueue->length = 0; //把队列长度初始化为0
linkqueue->front = (QueueNode*)malloc(sizeof(QueueNode)); //把队头指向空结点
linkqueue->rear = linkqueue->front; //把队尾指向队头,表示一个元素也没有
if(!linkqueue->front) //判断有没有指向为空
{
printf("初始化失败!\n");
return;
}
}
//入队操作
void Pushlinkqueue(Linkqueue* linkqueue,Element data)
{
//首先要申请内存,存储要插入的元素
QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));
if(newnode)
{
newnode->data = data;
//printf("%d %s\n",newnode->data.id,newnode->data.name);
}
else
{
printf("申请内存失败\n");
return;
}
//然后插入在队尾
linkqueue->rear->next = newnode; //把队尾所在内存的指针域指向新节点
//printf("%d %s\n",linkqueue->rear->next->data.id,linkqueue->rear->next->data.name);
linkqueue->rear = newnode; //队尾指针指向新节点,方便下一次插入
linkqueue->rear->next = NULL; //指针域指向空
}
//出队操作
void Poplinkqueue(Linkqueue* linkqueue)
{
QueueNode* node; //用来过渡,删掉第一个节点
node = linkqueue->front->next; //指向队首
linkqueue->front->next = node->next; //指向队首的后一个元素
free(node); //释放队首的空间
}
//打印队列
void Printlinkqueue(Linkqueue* linkqueue)
{
QueueNode* currnode = linkqueue->front->next; //指向头结点的下一个节点
while(currnode) //循环打印
{
printf("%d %s\n",currnode->data.id,currnode->data.name);
currnode=currnode->next;
}
}