之前博主已将讲过了使用链表对栈的这种结构的基本操作,同时也将数组对栈的基本操作的代码附上网址,以及对栈的应用已经提过。今天我们来看,使用链表对队列这种数据结构的操作
队列
队列:列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
其实呢,不必要去看着生硬的开头,学过栈之后我们都知道栈是只能在同一位置增加或删减元素的数据结构与之对应的是队列,它只能在尾部增加元素,即链表的尾插,同时他只能在头部删减元素,即链表的头删,当然这里分别命名为:入队与出队。
代码实现
代码的各个重要步骤大致都做了解析
/*队列的链表实现*/
/*头文件*/
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#define error(str) fprintf(stderr,"%s",str),exit(1)//自定义错误信息
/*结构体*/
typedef struct node
{
char ch;
struct node *next;
}node;
typedef struct p//存放指向表头与表尾的指针
{
node * first;//用于表头
node * tail;//用于指向表尾
}p;
/*函数声明*/
p* creat();//初始及创建队列
int isempty(p* q);//判断是否为空
void insert(p* q,char c);//入队
void pop(p* q);//出队
void print(p* q);//打印队列
/*主函数*/
int main()
{
int i;
char ch;
p* q=creat();
printf("实现入队\n");
for(i=0;i<5;i++)//这里设置五个单位
{
ch=getchar();
getchar();
insert(q,ch);
}
printf("\n打印队列\n");
print(q);
printf("then\n");
for(i=0;i<3;i++)
pop(q);
print(q);
return 0;
}
/*函数实现*/
p* creat()
{
p* q=(p*)malloc(sizeof(q));
q->first=q->tail=NULL;
return q;
}
int isempty(p* q)
{
return q->first==NULL;//为空为1
}
void insert(p* q,char c)
{
node* m=(node*)malloc(sizeof(node));
if(m==NULL)
error("out of space");
m->ch=c;
m->next=NULL;
if(q->tail==NULL)//q本为空
{
q->first=m;
q->tail=m;
}
else
{
q->tail->next=m;
q->tail=m;//使指针后移
}
}
void pop(p* q)
{
if(isempty(q))//考虑到三种特殊情况
error("empty!");
if(q->first==NULL)
error("empty!");
if(q->first==q->tail)
{
q->first=NULL;
q->tail=NULL;
}
else
{
node* n=q->first;
q->first=q->first->next;
free(n);//释放n
}
}
void print(p* q)
{
node* n=(node*)malloc(sizeof(node));
n=q->first;
if(n==NULL)
error("empty");
do
{
printf("%c ",n->ch);
}while(n=n->next);
printf("\n");
}
- 这里博主自己敲的代码,虽然没有报错,但是可能会稍有一点复杂,不过博主已经尽量简单化了,小伙伴们体谅。那么我们还是先做好准备工作,将各个区域划分清楚,可以让我们更容易检验bug并且思路不会混乱,建议在函数区就开始构建自己的思路。
- 这里博主采用的思路是用一个结构体,去存放指向表头的指针与指向表尾的指针。当然,也可以采用数组的方式。不过我更喜欢这样。😂因为指针的应用有时候会很方便。
- 对表的几个需要掌握的操作,就是函数区的那几个的,没有多余的,全部需要掌握。这里应该没有什么花里胡哨的操作建议小伙伴们自己在脑子里面转一下,如果没有思路的话,再看博主的代码。
- 如果真的觉得可能有些晦涩,建议小伙伴们复习一下指针与链表,指针作为c语言的灵魂,一定要掌握。
😓😓😓
传送门
这里有博主在数据结构学习目前存有的代码,所有数据结构博客的代码都在里面了。