上一节,我们用数组实现了队列。这一节,我们用链表实现。
下面看看用链表实现的队列吧:
//声明结点的结构体
struct Node{
int num; //具体数据
struct Node * next; //指向下一个结点的指针
};
struct Node head; //普通的结构体变量:头结点
//结构体的指针变量:指向链表的尾结点。
struct Node *tail = &head; //初始值为head的地址
下面我们需要实现几个方法:
0、依次显示所有数据
void show() //遍历,其实队列不需要这个功能
{
struct Node *currentNode; //当前结点的指针
currentNode = head.next; //当前结点的指针指向head结点的下一个结点
while(currentNode != NULL) //遍历
{
printf("%d, ", currentNode->num); //输出结点信息
currentNode = currentNode->next; //跳转到下一个结点
}
printf("\r\n");
}
1、读取队列的首元素,(不出列)
void peek()
{
if(head.next == NULL)
{
printf("队列为空\r\n");
return;
}
printf("队列的首元素: %d\r\n", head.next->num);
}
2、入列:在队列最后面插入一个数,时间复杂度为O(1)
void enqueue(int n) //在链表的指定位置插入新节点
{
//向操作系统申请一段内存空间,并强制转化成node的指针
struct Node * node = (struct Node *)(malloc(sizeof(struct Node)));
node->num = n; //为node结点赋值
node->next = NULL; //为node结点赋值
tail->next = node; //更换currentNode的next结点。也就是插入操作
tail = node;
head.num++;//head结点的num表示这个链表一共有几个结点
}
2.1、入列在队列最后