09 队列的链式存储

原理:队列的头指针指向头节点,尾指针执行最后一个节点。队列 + 有头链表。先进先出FIFO。

添加:在队尾添加一个节点;

删除:在对头删除一个节点,如果是最后一个节点需要更新rear值。

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3
 4 typedef struct node
 5 {
 6     int data;
 7     struct node *next;
 8 }LinkNode;
 9
10 typedef struct
11 {
12     LinkNode  *front;
13     LinkNode *rear;
14 }linkQueue;
15
16 linkQueue *linkQueue_init()
17 {
18     linkQueue *q = (linkQueue *)malloc(sizeof(linkQueue));
19     LinkNode *head = (LinkNode *)malloc(sizeof(LinkNode));
20     head->next = NULL;
21
22     q->front = head;
23     q->rear = head;
24
25     return q;
26 }
27
28 int linkQueue_is_empty(linkQueue *q)
29 {
30     return q->front == q->rear ? 1 : 0;
31 }
32
33 int linkQueue_add(linkQueue *q, int data)
34 {
35     LinkNode *node = (LinkNode *)malloc(sizeof(LinkNode));
36
37     node->data = data;
38     node->next = NULL;
39     q->rear->next = node;
40     q->rear = node;
41
42     return 0;
43 }
44
45 int linkQueue_del(linkQueue *q, LinkNode **data)
46 {
47     if (linkQueue_is_empty(q))
48     {
49         return -1;
50     }
51
52     *data = q->front->next;
53     q->front->next = (*data)->next;
54
55     if (*data == q->rear)
56     {
57         q->rear = q->front;
58     }
59
60     return -1;
61 }
62
63 int main()
64 {
65     linkQueue *q = NULL;
66     int i = 0;
67     LinkNode *tmp = NULL;
68
69     q = linkQueue_init();
70
71     for (i = 0; i < 10; i++)
72     {
73         linkQueue_add(q, i);
74     }
75
76     while (!linkQueue_is_empty(q))
77     {
78         linkQueue_del(q, &tmp);
79         printf("data:%d\n", tmp->data);
80         free(tmp);
81     }
82
83     return 0;
84 }
时间: 2024-10-05 05:16:28

09 队列的链式存储的相关文章

[转载]队列的链式存储

申明:转自    http://www.cnblogs.com/Romi/archive/2012/08/28/2660954.html 1 //队列的链式存储.C 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<malloc.h> 5 6 //定义队列 7 typedef struct node { 8 int data; 9 struct node *next; 10 }Queue; 11 12 //定义对手指

队列的链式存储---链表实现

/* 队列的链式存储 */ /* with no header */ struct Node; struct LinkQueue; typedef struct Node *PtrToNode; typedef struct LinkQueue *PtrTorf; struct Node{ ElementType X; PtrToNode Next; }; struct LinkQueue{ PtrToNode rear; PtrToNode front; }; int IsEmpty(PtrT

数据结构-队列-顺序链式存储

定义 队列(Queue):队列简称队,也是一种操作受限的线性表,只允许在表的一端进行插入,而在表的另一端进行删除.向队列中插入元素称为入队或进队:删除元素称为出队或离队. 队列的操作 队列不可以读取对中间的元素. 队列的存储结构 顺序存储 链式存储 顺序存储 队列的顺序实现是指分配一块连续的存储单元存放队列中的元素,并附设两个指针front 和rear分别指示队头元素和队尾元素的位置. 设队头指针指向队头元素,队尾指针指向队尾 元素的下一个位置(也可以让rear指向队尾元素,front指向队头元

数据结构:队列的链式存储结构

链队列的实现方法: 队列的链式存储结构,其实就是线性表的单链表,只不过它只能尾进头出而已,简称为链队列.为了操作上的方便,我们将队头指针指向链队列的头节点,而队尾指针指向终端节点.空队列时,front和rear都指向头节点. 注意:这里的实现是有头结点的,在队列的初始化函数中要为头结点开辟空间. 链队列的实现代码: #include <iostream> #include <stdlib.h> using namespace std; /**********************

队列的链式存储---链表实现(有头结点)

/* 队列的链式存储 */ /* with header */ /* with no typedef */ struct Node{ ElementType Ele; struct Node *Next; }; struct LinQ{ struct Node *rear; struct Node *front; }; struct LinQ * CreateQ( void ) { struct LinQ *Ptr; struct Node *header; Ptr = malloc(sizeo

队列的链式存储结构及实现

ref : https://blog.csdn.net/qq_29542611/article/details/78907339 队列的链式存储结构,其实就是线性表的单链表,只不过它只是尾进头出而已,我们把它简称为链队列.为了操作上的方便,我们将队头指针指向链队列的头结点,而队尾指针指向终端节点.如果 空队列时,front和rear都指向头结点. 入队操作: 在队尾添加元素,先将队尾元素的next指向添加的元素,然后将队尾指针重新指向新的队尾即可. 出队操作: 头结结点指向的结点即为队头结点,出

队列(FIFO)—循环队列、队列的链式存储

1 队列的定义 队列是只允许在一端(队尾)进行插入操作,而在另一端(队头)进行删除操作的线性表. 2 队列的特点 1)先进先出是队列最大的特点,是应用中非常常见的模型,例如排队: 2)队列也属于线性表,线性表的特性队列都拥有. 3 循环队列的实现及关键点 3.1 关键点 1)队列为空的条件:队头指针等于队尾指针,即head == tial: 2)队列中保留一个元素空间,当队列满时,尾指针和头指针之间还剩一个元素空间.队列为满的条件:(tial + 1) % quenceSize == head:

队列的链式存储结构(C语言实现)

1 #include <stdio.h> 2 #include <stdlib.h> 3 4 #define OK 1 5 #define ERR 2 6 #define TRUE 1 7 #define FALSE 0 8 9 typedef int status; //定义函数返回的状态,OK & ERR 10 typedef char datatype; //定义队列中每个元素的数据类型,这里暂定为字符型 11 12 typedef struct LinkQueue_

队列的链式存储(时间复杂度最小)

/* * 2015年4月17日14:04:56 * 目的:用链式存储来实现队列 * 这里我最开始想使用单链表来实现 * 大家来想一下啊,其实单链表实现不是特别好 * 因为虽然出队列的时间复杂度就是O(1),但是 * 入队列的时间复杂度却是O(n),因为每次都是从末尾进行插入 * 从末尾插入你首先就要找到当前指向尾指针的结点,由于链表是单向的 * 所以必须从front开始进行遍历才能找到rear前一个结点. * 为了解决入队列这个时间复杂度的问题,我觉得可以使用双向链表来解决 * 虽然这样会浪费一