十、队列的实现方法一(顺序表的复用)

方法一、通过对顺序表代码的复用实现队列

一、SeqList.h

#ifndef _SEQLIST_H_

#define _SEQLIST_H_

typedef void SeqList;

typedef void SeqListNode;

SeqList* SeqList_Create(int capacity);

void SeqList_Destroy(SeqList* list);

void SeqList_Clear(SeqList* list);

int SeqList_Length(SeqList* list);

int SeqList_Capacity(SeqList* list);

int SeqList_Insert(SeqList* list, SeqListNode* node, int pos);

SeqListNode* SeqList_Get(SeqList* list, int pos);

SeqListNode* SeqList_Delete(SeqList* list, int pos);

#endif

二、SeqList.c

#include <stdio.h>

#include <malloc.h>

#include "SeqList.h"

typedef unsigned int TSeqListNode;

typedef struct _tag_SeqList

{

int capacity;

int length;

TSeqListNode* node;

} TSeqList;

SeqList* SeqList_Create(int capacity) // O(1)

{

TSeqList* ret = NULL;

if( capacity >= 0 )

{

ret = (TSeqList*)malloc(sizeof(TSeqList) + sizeof(TSeqListNode) * capacity);

}

if( ret != NULL )

{

ret->capacity = capacity;

ret->length = 0;

ret->node = (TSeqListNode*)(ret + 1);

}

return ret;

}

void SeqList_Destroy(SeqList* list) // O(1)

{

free(list);

}

void SeqList_Clear(SeqList* list) // O(1)

{

TSeqList* sList = (TSeqList*)list;

if( sList != NULL )

{

sList->length = 0;

}

}

int SeqList_Length(SeqList* list) // O(1)

{

TSeqList* sList = (TSeqList*)list;

int ret = -1;

if( sList != NULL )

{

ret = sList->length;

}

return ret;

}

int SeqList_Capacity(SeqList* list) // O(1)

{

TSeqList* sList = (TSeqList*)list;

int ret = -1;

if( sList != NULL )

{

ret = sList->capacity;

}

return ret;

}

int SeqList_Insert(SeqList* list, SeqListNode* node, int pos) // O(n)

{

TSeqList* sList = (TSeqList*)list;

int ret = (sList != NULL);

int i = 0;

ret = ret && (sList->length + 1 <= sList->capacity);

ret = ret && (0 <= pos);

if( ret )

{

if( pos >= sList->length )

{

pos = sList->length;

}

for(i=sList->length; i>pos; i--)

{

sList->node[i] = sList->node[i-1];

}

sList->node[i] = (TSeqListNode)node;

sList->length++;

}

return ret;

}

SeqListNode* SeqList_Get(SeqList* list, int pos) // O(1)

{

TSeqList* sList = (TSeqList*)list;

SeqListNode* ret = NULL;

if( (sList != NULL) && (0 <= pos) && (pos <= sList->length) )

{

ret = (SeqListNode*)(sList->node[pos]);

}

return ret;

}

SeqListNode* SeqList_Delete(SeqList* list, int pos) // O(n)

{

TSeqList* sList = (TSeqList*)list;

SeqListNode* ret = SeqList_Get(list, pos);

int i = 0;

if( ret != NULL )

{

for(i=pos+1; i<sList->length; i++)

{

sList->node[i-1] = sList->node[i];

}

sList->length--;

}

return ret;

}

三、SeqQueue.h

#ifndef _SEQQUEUE_H_

#define _SEQQUEUE_H_

typedef void SeqQueue;

SeqQueue* SeqQueue_Create(int capacity);  //创建队列

void SeqQueue_Destroy(SeqQueue* queue);  //销毁队列

void SeqQueue_Clear(SeqQueue* queue);    //清空队列

int SeqQueue_Append(SeqQueue* queue, void* item);  //进队列

void* SeqQueue_Retrieve(SeqQueue* queue);    //出队列

void* SeqQueue_Header(SeqQueue* queue);   //获取队列头元素

int SeqQueue_Length(SeqQueue* queue);   //获取队列当前的长度

int SeqQueue_Capacity(SeqQueue* queue);   //获取队列的容量

#endif

四、SeqQueue.c

#include "SeqList.h"

#include "SeqQueue.h"

SeqQueue* SeqQueue_Create(int capacity) // O(1)

{

return SeqList_Create(capacity);

}

void SeqQueue_Destroy(SeqQueue* queue) // O(1)

{

SeqList_Destroy(queue);

}

void SeqQueue_Clear(SeqQueue* queue) // O(1)

{

SeqList_Clear(queue);

}

int SeqQueue_Append(SeqQueue* queue, void* item) // queue为队列的地址,item为插入元素的地址

{

return SeqList_Insert(queue, item, SeqList_Length(queue));   //从队尾插入

}

void* SeqQueue_Retrieve(SeqQueue* queue) // O(n)

{

return SeqList_Delete(queue, 0);   //从对头删除

}

void* SeqQueue_Header(SeqQueue* queue) // O(1)

{

return SeqList_Get(queue, 0);

}

int SeqQueue_Length(SeqQueue* queue) // O(1)

{

return SeqList_Length(queue);

}

int SeqQueue_Capacity(SeqQueue* queue) // O(1)

{

return SeqList_Capacity(queue);

}

五、main.c

#include <stdio.h>

#include <stdlib.h>

#include "SeqQueue.h"

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char *argv[])

{

SeqQueue* queue = SeqQueue_Create(20);

int a[10] = {0};

int i = 0;

for(i=0; i<10; i++)

{

a[i] = i + 1;

SeqQueue_Append(queue, a + i);

}

printf("Header: %d\n", *(int*)SeqQueue_Header(queue));

printf("Length: %d\n", SeqQueue_Length(queue));

printf("Capacity: %d\n", SeqQueue_Capacity(queue));

while( SeqQueue_Length(queue) > 0 )

{

printf("Retrieve: %d\n", *(int*)SeqQueue_Retrieve(queue));

}

SeqQueue_Destroy(queue);

return 0;

}

时间: 2024-10-29 17:54:45

十、队列的实现方法一(顺序表的复用)的相关文章

C#顺序表(数据结构)

xmfdsh我近来心情实在不好,只因为这两天课比较少,然后一下子时间太多,不知道干什么,心情郁闷......这是要闹哪样?这都让我一个郁闷了一个晚上.闲来无聊,回顾下之前学的C#数据结构,数据结构的重要性无论是对于哪门语言都是很必要也很重要的,课程中老师教的C语言,然后我自己自学的C#,再自学了C#的数据结构,对比了下,发现C,C++这些有着指针,比较低级点的语言,写起数据结构更加能考验一个人的思维,C#作为一门高级语言,也是有着自己一套数据结构的,这些更深层次的对比等我都学了比较精通再来慢慢对

数据结构Java实现01----线性表与顺序表

一.线性结构: 如果一个数据元素序列满足: (1)除第一个和最后一个数据元素外,每个数据元素只有一个前驱数据元素和一个后继数据元素: (2)第一个数据元素没有前驱数据元素: (3)最后一个数据元素没有后继数据元素. 则称这样的数据结构为线性结构. 二.线性表抽象数据类型: 1.线性表抽象数据类型的概念: 线性表抽象数据类型主要包括两个方面:既数据集合和该数据集合上的操作集合. 数据集合: 可以表示为a0,a1,a2,...an-1,每个数据元素的数据类型可以是任意的类型. 操作集合包括如下: 1

十二、队列的实现方法三(顺序表的优化)

由于通过顺序表代码的复用实现队列的过程中,进队列要从队列的最后一个元素进入,所以造成时间复杂度加大,现通过引进front.rear优化队列实现方法 front:代表头元素的下标 rear:代表队尾下一个元素的下标 一.SeqQueue.h #ifndef _SEQQUEUE_H_ #define _SEQQUEUE_H_ typedef void SeqQueue; SeqQueue* SeqQueue_Create(int capacity);  //创建队列 void SeqQueue_De

线性表 及Java实现 顺序表、链表、栈、队列

数据结构与算法是程序设计的两大基础,大型的IT企业面试时也会出数据结构和算法的题目, 它可以说明你是否有良好的逻辑思维,如果你具备良好的逻辑思维,即使技术存在某些缺陷,面试公司也会认为你很有培养价值,至少在一段时间之后,技术可以很快得到提高.同时,它也是软考的重点,我们需要对这部分的内容进行一下总结. 我们先看一下数据结构和算法的整体内容. 1.线性表 概念: 数据元素的排列方式是线性的. 分类: 分类规则是根据上图中元素的存储结构来划分的. (1)顺序表 基本思想:元素的存储空间是连续的.在内

顺序表、栈与队列

一.顺序表引入 1什么是线性表 1 在程序中,经常需要将一组数据元素作为整体管理和使用,需要创建这种元素组,用变量记录它们,传进传出函数等. 2 一组数据中包含的元素个数可能发生变化(增加或删除元素). 3 对于这种需求,最简单的解决方案便是将这样一组元素看成一个序列,用元素在序列里的位置和顺序,表示实际应用中 的某种有意义的信息,或者表示数据之间的某种关系. 4 这样的一组序列元素的组织形式,我们可以将其抽象为线性表. 5 一个线性表是某类元素的一个集合,还记录着元素之间的一种顺序关系. 6

顺序表操作补充(查找方法增加)

顺序表操作补充 二分查找 a.非递归方法实现二分查找 1 //[] 2 int BinarySearch(SeqList *pSeq, ElemType x) 3 { 4 assert(pSeq); 5 int left = 0; 6 int right = pSeq->size - 1; 7 while(left<=right) 8 { 9 int cur = left+(right-left)/2; 10 if(pSeq->array[cur] == x) 11 { 12 retur

顺序表[求并集 方法更新]

前文链接:http://www.cnblogs.com/tinaluo/p/5240727.html 不得不说明,水平是逐渐提高的.昨天晚上看的顺序表,在第1章,今天看第12章,重新更新了方法.题目:表A 1  3  5,表B 2 4 6,都呈非递减排序,现将两个表合并成一个表,也呈非递减排序,存放在A中(或者B中),言外之意是不能开辟新表! 其实这种方法是很简单的,无奈敲的代码太少,缺乏认识.思路很容易理解,拿出B中数据,沿着A的后面一直往前比较,如果小于就一直比,如果不小于就插入数据.唯一麻

C++学习(二十九)(C语言部分)之 顺序表

一.数据结构组织 存放数据的方式 精心选择的数据结构可以提升效率 数据结构 1.逻辑结构 一对多关系 父与子 一对一关系 排队中 多对多关系 两地的路线 2.存储结构 数据存放的位置关系 顺序存储数据 一个挨着一个的存储(数组) 链式存储方式 二.线性表逻辑方面是线性关系 一对一线性 每一个元素有唯一的前驱和后继顺序存储的线性表 就是顺序表链式存储的线性表 就是链表 三.顺序表主要实现方式---->数组/动态数组顺序存储的线型表数据结构--->为了管理数据对数据进行操作--->增加 删除

顺序表(存在问题)

#include <iostream> using namespace std; typedef int DataType; struct SeqList { int MAXNUM; int n; DataType *element; }; typedef struct SeqList *PSeqList; PSeqList createEmptySeq(int m) { PSeqList palist = (PSeqList) malloc (sizeof (struct SeqList))