数据结构与算法分析-队列

数据结构与算法分析-队列(单链表实现)

#include <stdio.h>
#include <stdlib.h>

typedef int elementtype;

typedef struct headnode *queue;
typedef struct node     *position;
struct node {
    elementtype data;
    position    next;
};
struct headnode{
    int         size;
    position    front;
    position    rear;
};   // headnode is only use head mark, next point to follow node , rear point to the end node, size declaration the length of whole queue.

queue init_queue(void);
void delete_queue(queue Q);
int isempty(queue Q);
elementtype dequeue(queue Q);
void enqueue(elementtype data,queue Q);

queue init_queue(void)
{
    queue Q;
    Q = (queue)malloc(sizeof(struct headnode));
    Q->front = NULL;
    Q->rear  = NULL;
    Q->size  = 0;
    return Q;
}
void delete_queue(queue Q)
{
    while(!isempty(Q))
        dequeue(Q);
    free(Q);
}
int isempty(queue Q)
{
    return ((Q->front == NULL)&&(Q->rear == NULL)&&(Q->size == 0));
}
void enqueue(elementtype data,queue Q)
{
    position P;
    P = (position)malloc(sizeof(struct node));
    P->data = data;
    P->next = NULL;

    if(isempty(Q))  //when Q is empty ,the new node(P) is both front node and rear node.
        Q->front = P;
    else
        Q->rear->next = P;//when Q isn‘t empty ,the new node(P) is rear node, the front node isn‘t change, but original rear->next will point to P

    Q->rear = P;
    Q->size++;
}
elementtype dequeue(queue Q)
{
    elementtype data;
    position tem;
    if(!isempty(Q))
    {
        tem = Q->front;
        data = Q->front->data;
        Q->size--;
        Q->front = tem->next;
        if(Q->size == 0)
            Q->rear = NULL;
        free(tem);
        return data;
    }
    else
    {

        printf("enqueue : error ! Q is a empty queue !\n");
        return 0 ;
    }
}

int main(int argc ,char** argv)
{
    queue Q;
    elementtype data;
    int i = 0;
    Q = init_queue();
    printf("queue size is : %d\n\n",Q->size);
    printf("enqueue 10 datas\n");
    for(i=0;i<10;i++)
    {
        enqueue(i, Q);
    }
    printf("queue size is : %d\n\n",Q->size);
    printf("enqueue 5 datas\n");
    for(i=0;i<5;i++)
    {
        data = dequeue(Q);
        printf("dequeue data is : %d\n",data);
    }
    printf("enqueue 10 datas\n\n");
    for(i=10;i<20;i++)
    {
        enqueue(i, Q);
    }
    printf("queue size is : %d\n",Q->size);

    for(i=0;i<15;i++)
    {
        data = dequeue(Q);
        printf("dequeue data is : %d\n",data);
    }
    printf("queue size is : %d\n",Q->size);
}

时间: 2024-08-05 23:55:04

数据结构与算法分析-队列的相关文章

《数据结构与算法分析:C语言描述_原书第二版》CH3表、栈和队列_reading notes

表.栈和队列是最简单和最基本的三种数据结构.基本上,每一个有意义的程序都将明晰地至少使用一种这样的数据结构,比如栈在程序中总是要间接地用到,不管你在程序中是否做了生命. 本章学习重点: 理解抽象数据类型(ADT)的概念 学习如何对表进行有效的操作 熟悉栈ADT及其在实现递归方面的应用 熟悉队列ADT及其在操作系统和算法设计中的应用 ADT 抽象数据类型(abstract data type)是一个操作的集合,是数学的抽象,在ADT中不涉及如何实现操作的集合,这可以看作是模块化设计的扩充. 对于每

数据结构与算法分析(8)表、栈和队列(三)

    介绍队列的相关知识:     (3)队列ADT: 像栈一样,队列也是表.然而,使用队列时插入在一端进行而删除在另一端进行. 3.1队列模型 队列的基本操作是Enqueue(入队),它是在表的末端插入一个元素:还有Dequeue(出队),它是删除(或同时)返回在表的开头的元素.   3.2队列的数组实现 如同栈的情形一样,对于队列而言任何表的实现都是合法的.队列的链表实现是直接的,现在我们只讨论队列的数组实现. 1)队列数组实现的ADT: #define MinQueueSize (5)

数据结构1:数据结构和算法分析

问题引出 假设有一道题目:有一组N个数而要确定其中第k个最大者,我们称之为选择问题,那么这个程序如何编写?最直观地,至少有两种思路: 1.将N个数读入一个数组中,再通过某种简单的算法,比如冒泡排序法,以递减顺序将数组排序,则第k个位置上的元素就是我们需要的元素 2.稍微好一些的做法,将k个元素读入数组并以递减顺序排序,接着将接下来的元素再逐个读入,当新元素被读到时,如果它小于数组中的第k个元素则忽略之,否则将其放到数组中正确的位置上,同时将数组中的一个元素挤出数组,当算法终止时,位于第k个位置上

数据结构--二项队列分析及实现

一,介绍 什么是二项队列,为什么会用到二项队列? 与二叉堆一样,二项队列也是优先级队列的一种实现方式.在 数据结构--堆的实现之深入分析 的末尾 ,简单地比较了一下二叉堆与二项队列. 对于二项队列而言,它可以弥补二叉堆的不足:merge操作的时间复杂度为O(N).二项队列的merge操作的最坏时间复杂度为O(logN). 二,二项队列的基本操作及实现 在详细介绍二项的队列的基本操作之前,先了解下二项队列这种数据结构: 1)一个二项队列是若干棵树的集合.也就是说,二项队列不仅仅是一棵树,而是多棵树

《数据结构与算法分析—C语言描述》pdf

下载地址:网盘下载 内容简介 编辑 <数据结构与算法分析:C语言描述(原书第2版)>内容简介:书中详细介绍了当前流行的论题和新的变化,讨论了算法设计技巧,并在研究算法的性能.效率以及对运行时间分析的基础上考查了一些高级数据结构,从历史的角度和近年的进展对数据结构的活跃领域进行了简要的概括.由于<数据结构与算法分析:C语言描述(原书第2版)>选材新颖,方法实用,题例丰富,取舍得当.<数据结构与算法分析:C语言描述(原书第2版)>的目的是培养学生良好的程序设计技巧和熟练的算

数据结构与算法分析-索引

作者:xiabodan 出处:http://blog.csdn.net/xiabodan 算法和数据结构是计算机科学的核心内容.作为程序猿,编程是我们的实战项目.然而,写出程序还不够.一个程序在应对一些大型而复杂的情况时.会耗费大量的时间.我们能够非常easy写出一个从文件里找到一个词的程序.比方逐词扫描.看是否相符.但假设我们的文件有几十TB,并且要从文件里找到上百个词,逐个扫描的办法就差点儿不可行.我们须要优化程序,以便我们的程序能够应对复杂问题. 算法研究解决这个问题的方法,而数据结构则是

数据结构和算法分析

转自[五月的仓颉] http://www.cnblogs.com/xrq730/p/5122436.html 数据结构 数据结构是计算机存储.组织数据的方式,是指数据相互之间存在一种或多种特定关系的数据元素的集合.通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率(这就是为什么我们要研究数据结构的原因),数据结构往往同高效的检索算法和索引技术相关. 常见的数据结构有数组.栈.队列.链表.树.散列等,这些数据结构将是本数据结构的分类中重点研究的对象. 算法分析 算法是为求解一个问题需要遵

《数据结构与算法分析》学习笔记(五)&mdash;&mdash;队ADT

一.队的概念        队列也是一种表,但是是一种受限的表,只允许从一端插入,另一端山粗的表. 二.队列的数组实现 #define QMAXSIZE 100 typedef int Position; typedef int QElement; typedef struct queue { QElement Els[QMAXSIZE]; Position head,tail; }Queue; void QCreate(Queue &Q) { Q.head = Q.tail = 0; } vo

【转】数据结构和算法分析

问题引出 假设有一道题目:有一组N个数而要确定其中第k个最大者,我们称之为选择问题,那么这个程序如何编写?最直观地,至少有两种思路: 1.将N个数读入一个数组中,再通过某种简单的算法,比如冒泡排序法,以递减顺序将数组排序,则第k个位置上的元素就是我们需要的元素 2.稍微好一些的做法,将k个元素读入数组并以递减顺序排序,接着将接下来的元素再逐个读入,当新元素被读到时,如果它小于数组中的第k个元素则忽略之,否则将其放到数组中正确的位置上,同时将数组中的一个元素挤出数组,当算法终止时,位于第k个位置上