[转载]队列的链式存储

申明:转自    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 //定义对手指针和队尾指针
 13 typedef struct pointer {
 14     Queue *front;//队首指针,队首指针不存放队列元素
 15     Queue *rear;//队尾指针,指向队尾的结点
 16 }Qpointer;
 17
 18 //队列初始化,队首和队尾指向同一个内存空间,指针域为NULL
 19 void QueueInit(Qpointer *qp)
 20 {
 21     Queue *que;
 22     que = (Queue*)malloc(sizeof(Queue));
 23     que->next = NULL;
 24     qp->front = que;
 25     qp->rear = que;
 26 }
 27
 28 //判断队列是否为空:为空返回1,不为空返回0
 29 int IsEmpty(Qpointer *qp)
 30 {
 31     //判断方法:对手指针和队尾指针是否相同
 32     if (qp->front == qp->rear)
 33     {
 34         return 1;
 35     }
 36     return 0;
 37 }
 38
 39 //插入数据元素:插入成功返回1,失败返回0
 40 int QueuePush(Qpointer *qp, int element)
 41 {
 42     Queue *que;
 43     que = (Queue*)malloc(sizeof(Queue));
 44     if (que == NULL)
 45     {
 46         return 0;
 47     }
 48     que->data = element;
 49     que->next = NULL;
 50     qp->rear->next = que;//将节点插入队列尾
 51     qp->rear = que;//调整队尾指针(队尾指针,指向队尾的结点)
 52     return 1;
 53 }
 54
 55 //删除数据元素:删除成功返回1,失败返回0
 56 int QueuePop(Qpointer *qp, int *element)
 57 {
 58     Queue *que;
 59     if (IsEmpty(qp))
 60     {
 61         return 0;
 62     }
 63     que = qp->front->next;//que指向队列头结点的下一个节点,即真正的队首
 64     *element = que->data;//将要出队列的元素
 65     qp->front->next = que->next;
 66     //判断队列是否就只剩下一个元素
 67     if (qp->rear == que)
 68     {
 69         qp->rear = qp->front;
 70     }
 71     free(que);
 72     return 1;
 73 }
 74
 75 int main()
 76 {
 77     Qpointer *qp;
 78     int x;
 79     int element;
 80     //初始化队列
 81     qp = (Qpointer*)malloc(sizeof(Qpointer));
 82     QueueInit(qp);
 83     printf("input positive integers:\n");
 84     scanf("%d", &x);
 85     while (x > 0)
 86     {
 87         QueuePush(qp, x);
 88         scanf("%d", &x);
 89     }
 90     //输出队列:队首->队尾
 91     Queue *p = qp->front->next;
 92     if (p == NULL)
 93         return 0;
 94     printf("queue element:\n");
 95     while (p)
 96     {
 97         printf("%d ", p->data);
 98         p = p->next;
 99     }
100     printf("\n");
101     //删除队列
102     printf("delete queue:\n");
103     while (QueuePop(qp, &element))
104     {
105         printf("%d ", element);
106     }
107     printf("\n");
108     //释放内存空间
109     p = qp->front;
110     free(p);
111     free(qp);
112
113     return 0;
114 }

1.队列定义:除了定义队列中节点的数据结构,还专门定义了队首和队尾,方便对队列操作,这样一来,队列的操作就只需要对pointer结构体中的对手指真和队尾指针进行。

2.判断是否为空
当队首指针和队尾指针只想同一块地址时,队列为空,队列为空就是说队列中没有数据元素。注意队首front只是队列的头结点,并不代表队列的实际队首,在队列不为空时,队列的实际队首应该是头结点的下一个节点。

3.插入数据元素

插入在队尾进行,插入后,新插入的节点就成为了队尾。

4.删除数据元素

删除在队首进行,需要注意的是,当实际的队首也是队尾时,删除队列中的一个数据后队列就成为了空队列(rear=front)。最后不要忘了将删除的数据的内存空间释放掉。

5.注意点

最后释放内存时,一定要先释放掉pointer中的队首指针和队尾指针指向的内存空间,再释放掉pointer结构体指向的内存空间。

时间: 2024-10-03 22:54:00

[转载]队列的链式存储的相关文章

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

/* 队列的链式存储 */ /* 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前一个结点. * 为了解决入队列这个时间复杂度的问题,我觉得可以使用双向链表来解决 * 虽然这样会浪费一

顺序循环队列和链式存储队列(带头结点和不带头结点)

1.顺序存储的循环队列 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <stdbool.h> 4 5 typedef int ElementType; 6 typedef int Position; 7 typedef struct QNode* PtrToNode; 8 struct QNode { 9 ElementType *Data; 10 Position Front, Rear; 11 int M