数据结构_线性表_顺序队列_循环队列_链队列

个位看官,由于队列操作相对简单,我啥也不多说,直接上代码,欢迎验证!!!

#pragma mark --abstract
//队列(queue)是只允许在表的一端进行插入,在表的另一端进行删除的线性表,允许插入的一端称为队尾(rear)
//允许删除的一端叫做队头(font),不含元素的队列称为空队列
//队列的特点是先进先出(FIFO线性表)

#pragma mark --分类
//1.队列的顺序存储结构称为顺序队列(sequential queue),他是由存放队列的一维数组和分别指向队头和队尾的指针组成.通常约定:队尾指针指示的队尾元素在一维数组中的当前位置,队头指针指向队头元素在一维数组中的当前位置的前一个位置

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

#pragma mark --顺序队列的定义

#if 0
#define maxsize 10 //队列可能的最大长度
typedef int elemtype;
typedef struct {

    elemtype elem[maxsize];
    int font,rear;

}sequeuetp;
#endif
//假设sa为sequeuetp 的一个变量
//入队操作
//sq.rear=sq.rear+1;
//sq.elem[sq.rear]=x;

//出队操作
//sq.font=sq.font+1

//空队列sq.font=sq.rear

//满栈的sq.rear=maxsize ,这就有假溢出现象,就出现了
//2.循环队列
//循环的表,设想把sq.elem[0]接在sq.elem[maxsize-1]之后,利用取模运算就很容易实现循环意义的加1操作
//入队
//sq.rear=(sq.rear+1)%maxsize
//sq.elem[sq.rear]=x;

//出队
//sq.font=(sq.font+1)%maxsize

//对空sq.rear=sq.font;
//队满 (sq.rear+1)%maxsize=sq.font;

#pragma mark -------------循环队列的定义--------------------
#define maxsize 11 //(循环队列的最大长度10 +1)
typedef int elemtype;

typedef struct {

    elemtype elem[maxsize];
    int font,rear;

}cqueuetp;

#pragma mark --队列的初始化操作
void initQueue(cqueuetp*cq) {

    cq->font=0;
    cq->rear=0;

}

#pragma mark 判断队列是否为空
bool QueueEmpty(cqueuetp*cq) {

    return (*cq).font==(*cq).rear?true:false;
}

#pragma mark 求队列的长度
int size(cqueuetp*cq) {
// 加上maxsize 时考虑到cq->rear -cq->font<0的情况
    return (maxsize+cq->rear-cq->font)%maxsize;
}

#pragma mark 读取队头的元素

elemtype Head(cqueuetp*cq) {

    if (cq->rear==cq->font) {//循环队列不为空
        return NULL;
    }
    else {

        return cq->elem[cq->font+1]%maxsize;
    }

}

#pragma mark 入队操作
void EntrayQueue(cqueuetp*cq,elemtype x) {

    if ((cq->rear+1)%maxsize==cq->font) { //队满
        printf("overflow\n");
    }
    else {

        cq->rear=(cq->rear+1)%maxsize;
        cq->elem[cq->rear]=x;
    }

}

#pragma mark 出队操作

elemtype DeletQueue(cqueuetp*cq) {

    if ((*cq).font==(*cq).rear) {
        return NULL;
    }else {

        cq->font=(cq->font+1)%maxsize;
        return (cq->elem[cq->font]);
    }

}

#pragma mark  ------------------链队列---------------------
//和栈的顺序存储一样,队列的顺序存储也可能存在溢出的现象,因此考虑队列的链式存储结构
//队列的链式存储结构成为链队列(linked queue),它实际上是一个同时带有头指针和尾指针的单链表,
//头指针指向头结点,尾指针指向尾结点,虽然用头指针就可以唯一确定这个单链表,但是插入操作总是在
//队尾进行,如果没有队尾指针,入队的时间复杂程度,将有O(1)升至O(n)

//判空的条件 lq.front=lq.rear;

#pragma mark --链队列的定义
typedef struct node{

    elemtype data;
    struct node*next;;

}nodetype;
typedef struct {
    nodetype *front;
    nodetype *rear;

}lqueue;

#pragma mark --初始化
void initLqueue(lqueue*lq) {
    //设置一个空队列
    lq->front=(nodetype*)malloc(sizeof(nodetype));
    lq->front->next=NULL;
    lq->rear=lq->front;

}

#pragma  mark --判空
bool EmptyLqueue(lqueue*lq) {

    return lq->front==lq->rear?true:false;
}

#pragma mark --求队长
int lqSize(lqueue*lq) {

    int i=0;
    nodetype*p=lq->front->next;
    while (p) {
        i++;
        p=p->next;
    }
    return i;
}

#pragma mark --读取队头元素操作

elemtype getHead(lqueue*lq) {

    if (lq->front==lq->rear) {
        return NULL;
    }
    else {

        return lq->front->next->data;
    }

}

#pragma mark 入队操作
void EntryQueue(lqueue*lq,elemtype x){
    nodetype*s;
    s=(nodetype*)malloc(sizeof(nodetype));
    s->data=x;
    s->next=NULL;
    lq->rear->next=s;
    lq->rear=s;

}

#pragma mark 出队操作

elemtype delQueue(lqueue*lq){

    elemtype x;
    nodetype*p;
    if (lq->front==lq->rear) {
        return NULL;
    }
    else {

        p=lq->front->next;
        lq->front->next=p->next;
        if (p->next==NULL) //当链队列中仅有一个结点时,出队时要修改队尾指针
            lq->rear=lq->front;

            x=p->data;
            free(p);
            return x;

    }

}

#pragma mark 总结
//1>链队列和链栈类似,无需判断栈满的情况
//2>在出队列的时候,原队列只有一个结点时,该结点既是队头也是队尾,姑删除此结点时必须修改队尾指针,且删除此结点后队列变成空
//3>和链栈情况相同,对于链队列,一般不会产生队满,由于队列的长度一般比较大,所以用链式存储结构比顺序存储结构更有利
时间: 2024-08-07 15:29:47

数据结构_线性表_顺序队列_循环队列_链队列的相关文章

数据结构_线性表的顺序表示和链式表示

/********************************************************************************************************************/ 声明: (1)*.h文件是代码声明, *.cpp文件是代码实现; (2)一般头文件的内容有: ①类型声明; ②函数声明; ③枚举; ④常量; ⑤宏 (3)以下说明是为了方便代码文件的管理而设定的一些规则, 以后代码都会按照此规则编写: 1)Pubuse.h 是几

【数据结构】线性表的顺序表示及实现

线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素. 假设线性表的每个元素需要占用l个存储单元,并以所占的第一个单元的存储地址作为数据元素的存储地址.则线性表中第i+1个元素元素的存储位置LOC(ai+1)和第i个数据元素的存储位置LOC(ai)之间满足关系: LOC(ai+1)=LOC(ai)+l 一般来说,线性表第i个数据元素ai的存储位置为: LOC(ai)=LOC(a1)+(i-1)*l 式中LOC(a1)是线性表的第一个数据元素a1的存储位置,通常称做线性表的起始位

【数据结构】 线性表的顺序表

线性表是一种最为常用的数据结构,包括了一个数据的集合以及集合中各个数据之间的顺序关系.线性表从数据结构的分类上来说是一种顺序结构.在Python中的tuple,list等类型都属于线性表的一种. 从抽象数据类型的线性表来看,一个线性表应该具有以下这些操作(以伪代码的形式写出): ADT List: List(self) #表的构造操作,创建一个新表 is_empty(self) #判断一个表是不是空表 len(self) #返回表的长度 prepend(self,elem) #在表的开头加入一个

数据结构之线性表(顺序表,单链表)——图书管理系统

顺序表: 代码如下: 1 #include<iostream> 2 #include<fstream> 3 #include<string> 4 #include<iomanip> 5 using namespace std; 6 #define OK 1 7 #define ERROR 0 8 #define OVERFLOW -2 9 typedef int Status; 10 typedef int ElemType; 11 12 #define M

算法实例_线性表 By:比方

算法实例_线性表 By:比方 什么是线性表? 从线性表的功能逻辑上来看,线性表就是由n(n>=0)个数据元素的排序组合,数据由x1,x2,x3,...,xn结构有序的顺序排列. 线性表的结构和特点 1.              仅有一个开始节点x1,没有直接前趋节点,有妾只有一个直接后续节点x2: 2.              仅有一个终结节点xn,仅有一个前趋节点xn-1; 3.              对于同一个线性表,其中没一个数据的元素,都必须具备相同的数据结构类型, 且没一个元素

数据结构——线性表(顺序实现)

好好学习基础知识,出人头地就靠它了,内外兼修.(好吧,我现在内外都不行)写这篇文章的目的就是为了,巩固刚学完的线性表,个人能力有限,若有不当之处,望指出. 线性表 好了,扯完了,说正事: 1.定义 线性表是一种及其常用的并且最简单的一种数据结构.简单来说,线性表就是集合里的元素的有限排列.(在这里我把集合定义为具有相同属性的元素,会有些狭义) 在线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的(注意,这句话只适用大部分线性表,而不是全部.比

[笔记]python数据结构之线性表:linkedlist链表,stack栈,queue队列

python数据结构之线性表 python内置了很多高级数据结构,list,dict,tuple,string,set等,在使用的时候十分舒心.但是,如果从一个初学者的角度利用python学习数据结构时,这些高级的数据结构可能给我们以迷惑. 比如,使用list实现queue的时候,入队操作append()时间复杂度可以认为是O(1),但是,出队操作pop(0)的时间复杂度就是O(n). 如果是想利用python学学数据结构的话,我觉得还是自己实现一遍基本的数据结构为好. 1.链表 在这里,我想使

数据结构算法C语言实现(一)---2.3线性表的顺序表示和实现

注意: 虽然是用C语言实现,但是考虑到使用了一个C++的特性----引用以简化代码,所以所有的代码均以cpp作为后缀,用g++编译(以后不做说明). g++版本: 一.简述 本节主要讲述线性表的顺序实现,主要操作包括建表,插入元素,删除元素,查找元素,合并表等操作,根据书中伪代码编写了C语言,使用int类型进行了测试,需要注意的是查找元素时使用了函数指针,C语言初学者不易理解,可查阅相关书籍学习. 二.头文件 1 //head.h 2 /** 3 My Code 4 */ 5 #include

《数据结构》复习之线性表(顺序表和链表)

线性表的概念 线性表的比较 线性表的数据结构 顺序表的算法操作 双链表的补充 总结 1.线性表的概念 线性表的存储结构有顺序存储结构和链式存储结构两种.前者成为顺序表,后者称为链表. 顺序表: 顺序表就是把线性表中的所有元素按照其逻辑顺序,一次存储到从指定的存储 位置开始的一块连续的存储空间中,如下图所示. 链表 在链表的存储中,每一个节点不仅包含所存元素本身的信息,还包含元素之间的逻辑关系的信息,即前驱节点包含后继节点的地址信息,这样就可以通过前驱节点中的地址信息方便地找到后继节点的位置,如下

[C++] 数据结构(C):线性表之顺序表

1 顺序表 ADT + Status InitList(SeqList &L) 初始化顺序表 + Status GetElement(SeqList L, int i, ElementType &e) (按位)取值  + int LocateElement(SeqList L, ElementType e) (按值)查找  + Status ListInsert(SeqList &L, int i, ElementType e) (按位)插入  + Status ListDelet