今天应要求补充了很多注释,没问题很容易看懂,我还加了实现原理图,so easy,妈妈再也不用担心你的学习了!ok
队列:先进先出,只能实现尾插,头删
如下图:
// main.c
// 队列
// Created by fzl
// Copyright © All rights reserved.
#include <stdio.h>
#include <stdlib.h>
typedef struct Person
{
int age;
char name[20];
}Person;
typedef struct LINK
{
Person data;
struct LINK *next;
}LINK,*pLINK;
typedef struct Queue
{
pLINK first;//头指针(指向第一个节点)
pLINK rear;//尾指针(指向最后一个节点)
}Queue,*pQueue;
/**
创建队列
*/
pQueue createQueue(pQueue queueHead)
{
if(queueHead==NULL)
{
queueHead=(pQueue)malloc(sizeof(Queue));//在堆区开辟内存
queueHead->first=NULL;
queueHead->rear=NULL;
}
return queueHead;
}
Person getData()
{
Person person;
printf("请输入这个人的信息[age name]:");
scanf("%d%s",&person.age,person.name);
return person;
}
/**
* 插入数据
*/
void insertData(pQueue queueHead)
{
pLINK p=(pLINK)malloc(sizeof(LINK));
p->data=getData();
if(queueHead->first==NULL)
{
//说明插入的数据为第一个
queueHead->first=p;
queueHead->rear=p;
}
else//不为第一个(用rear找出最后一个)
{
queueHead->rear->next=p;//将新节点插入
queueHead->rear=p;//将尾指针指向最后一个
}
}
void printData(pQueue queueHead)
{
if(queueHead->first==NULL)
{
printf("无信息可打印\n");
return;
}
pLINK temp;
printf("first-->");
for (temp=queueHead->first; temp!=queueHead->rear; temp=temp->next)
{
printf("[%d %s]--->",temp->data.age,temp->data.name);
}
printf("[%d %s]<----rear\n",queueHead->rear->data.age,queueHead->rear->data.name);
}
void deleteData(pQueue queueHead)
{
if(queueHead->first==NULL)
{
printf("无信息可删除\n");
return;
}
if(queueHead->first==queueHead->rear)//说明只有一个节点
{
free(queueHead->first);
queueHead->first=NULL;
queueHead->rear=NULL;
}
else//说明不止一个节点
{
pLINK current=queueHead->first;//找出第一个
queueHead->first=current->next;//将first指向第二个节点
free(current);//删除第一个节点
}
//此处必须注意:队列是先进先出,所以只能头删尾插
}
int main()
{
pQueue queueHead=NULL;
queueHead=createQueue(queueHead);
insertData(queueHead);
insertData(queueHead);
insertData(queueHead);
printData(queueHead);
deleteData(queueHead);
printData(queueHead);
deleteData(queueHead);
printData(queueHead);
deleteData(queueHead);
printData(queueHead);
return 0;
}