首先链表队列实质上就是由两个队列指针加上一系列的结点构成的
队列指针的作用:既然叫做队列指针那么肯定是将你的一个链表定义为一个队列,在之前的学习中,链表是一个比较具有开放式的顺序表,你既可以在中间插入或删除其中的某个结点也可以自由的更改的其节点中包含的数据信息,但是当一个链表转化为链表队列的时候(也就是受到了队列指针的控制后),此时的‘链表’就没有那么自由了, 要么你插入元素只能从尾部插入,头部取出。要么你只能从头部插入,尾部取出。换句话说这个链表就具有队列的性质。队列指针一般有两个一个指向我们队列的头节点,另一个指向队列的尾结节点:在之前学习链表的时候,结点对于大家来说都不陌生,就是一个结构体然后这个结构体中依据你这个节点的具体情况而定包含了相关的信息。这次的队列链表中我们简单的构造结点——其中包含一个整型的数和一个指针(这个或者说是指针就是为了指向下一个结点)
做一个不太形象的比喻我们把一个结点比作是一个只有一支手臂的人,这个手臂就是指针,这个人的头就是整型的数。这个人可以通过手臂去指向另一个人。当很多人手拉手时就构成了链表
以上就是我们在构建一个链表队列的时候需要了解的内容,脑袋里面先有一个大致的框架然后去写代码会变得轻松的多。
列队第一步构建节点结构体
那么自然而然的我们要想构建一个链表队列首先去构建一个节点的结构体,也就是链表队列的一个元素。
typedef struct node{
int data;
struct node *p
}Node,*Pnode;
以上就是一个节点的结构体。我们来分析一下,首先这个结构体本来叫做struct node,然后在定义时加上typedef就是更改了他的名字变为Node和指针类*Pnode。做这样的改名主要是为了以后在调用这个结构体时可以方便输入一点,否则每次都要输入struct node 变量名这样子显得冗杂。然后这个结构体中包含了一个int型的数,和一个指针,这样的一个结构体就是我们想要的了。他的作用前文说过了就是在排队列链表时作为一个队列元素进入队列。
列队第第二步构建队列指针
定义完一个结构体变量后,当然然就是去定义我们的队列指针
typedef struct queue{
Pnode pf ,pr;
}Linkqueue,*Plinkqueue;
难看出队列指针这个结构体中就是包含了两个指针(我定义的指向队列头的叫pf,指向队列尾的叫做pr),但这两个指针的类型是Pnode *型也就上面我们定义的结点型,这说明了什么?———不难理解,明显就表明了咱们这两个指针指向的是一个一个的结点。
好了做好这两个准备工作之后我们就需要去建立我们的链表队列了
列队第三步建立队列
好了做好这两个准备工作之后我们就需要去建立我们的链表队列了
我们在这里可以自己定义一个创建链表的函数这样我们调用他的时候就可以创建一个链表队列当然创建时候的这个链表队列里面没有元素
这里我们就将这个函数命名为plinkqueue queue_create( );下面我会来写这个函数实现创建的具体步骤,然后再一 一做解析。
Plinkqueue queue_creat()
{
Plinkqueue q = malloc(sizeof(Linkqueue));
if(q == NULL){
return NULL;
}
Pnode p = malloc(sizeof(Node));
if(NULL == p) {
return NULL;
}
p->next = NULL;
q->pf = q->pr = p;
return q;
}
我们来分析一下上面的代码
Plinkqueue q = malloc(sizeof(Linkqueue));
就是创建了一个结构体元素q,这个结构体元素就是我们定义的Plinqueue的,然后这个结构体中就包含了我们需要的链表队列的指针(前面定义说过的),可以知道的是计算机都需要一个空间来存放这个结构体,所以malloc就是开辟了一个结构体这么大的空间用来放这个q。既是:
q: |pf|pr|
Pnode p = malloc(sizeof(Node));
也就是我们创建了一个节点,这个节点的类型的就是我们前面定义好的因为加上了Plinkqueueu。
p:|data|next|
其中两个if语句是我用来当malloc开辟空间失败时就退出创建程序的,一般状况下都能开辟空间成功的,但是谁能保证不出差错呢,所以我们加上也不影响并且能保证程序的正常运行。
q->next = NULL;
将q的指针指向NULL防止变成野指针,就向前面比喻过得我们固定好他的手臂免得他乱指。
将队列指针与我们准备好的空结点连接起来
q->pf = q->pr = p;
也就是大概这样子的:
以上一个链表队列就已经建立好了,但是很明显这个链表队列中仅有一个没存数据的头结点p和一个我们的队列指针q。我们接下来就讲一下如何向这个队列中插入新成员,依据前面说的新成员也就是新节点。
插入节点
我先写一个插入节点的函数,值得注意自己的函数都是包含了自己的思想的,也就是说每个人实现插入节点的想法不同,那么其写出来的代码也就不同。
PLink linkqueue_in(Plink q,int data)
{
Pnode p = malloc(sizeof(Node));
p->data = data;
p->next = NULL;
q->pr->next =p;
q->pr = p;
}
以上就是在这个链表列队中插入了一个节点。
Pnode n = malloc(sizeof(Node));
就是为我开辟了一个新的节点,也就是我们要插入的节点。
n->data = data;
给我新的节点写入数据,按照比喻来说就是给它把头装好
n->next = NULL;
给我们新的节点的指针指向空,按照比喻来说就是固定好它的手,不让它的手乱指
q->pr->next =n;
让我们的头结点指向这个节点这样这个节点就和我们的链表队列连接起来了
q->pr = n;
让我们的队列尾指针指向这个节点,这是约定好的队尾指针需要一直指向我们链表队列的最后一个节点。
大概就是下图这个样子:
其中红色×掉就是我们之前已经有的连接,蓝色的连线就是我们新建起来的连接。这样就成功的在我们队列中插入了一个节点(成员)。
通过上述,只要理解消化就不难写处出出队的代码这里就不在详解了,理解每一个节点的构成以及其作用,就能大致掌握链式队列。当然这也是最简单的链式队列。
Os:其实每一段代码都代表着你的逻辑思维,如果这篇文章能够帮助你理解链式队列那么就达到了我的目的。如果你仅仅照搬我的代码去实现了链式队列,那么这篇文章就变得毫无意义。希望每一位小伙伴都能够有足够的耐心去锻炼自己的编程思维!!
ps:博主也只是刚在华清远见参加学习的一个小白,但是我相信只要认真学习也能成为自己的心中的那种大牛!(小小一句:华清远见是真的不错!)



