顺序表的实现---动态

“Seq_D.h”

#ifndef __SEQ_LIST_H__

#define __SEQ_LIST_H__

#define INIT_SIZE 2

#define INC 2

#include <stdio.h>

#include <assert.h>

#include <string.h>

#include <malloc.h>

#include <stdlib.h>

typedef int DataType;

typedef struct SeqList

{

DataType *data;//指向空间的指针

int size;//有效个数

int capacity;//容量

}SeqList, *pSeqList;

void InitSeqList(pSeqList pSeq);//初始化

void CheckCapacity(pSeqList pSeq);//扩容

void Destory(pSeqList pSeq);//销毁

void PrintSeqList(SeqList Seq);//打印

void PushBack(pSeqList pSeq, DataType x);//尾插

void PopBack(pSeqList pSeq);//尾删

void PushFront(pSeqList pSeq, DataType x);//头插

void PopFront(pSeqList pSeq);//头删

void Insert(pSeqList pSeq, int pos, DataType x);//在某一位置上插入某一元素

void Remove(pSeqList pSeq, DataType x);//删除x元素

void RemoveAll(pSeqList pSeq, DataType x);//删除所有x元素

int Find(SeqList Seq, DataType x);//查找某一元素

void ReverseList(pSeqList pSeq);//逆置

void SortList(pSeqList pSeq);//排序

int BinarySearch(SeqList Seq, DataType x);//二分查找

void InitSeqList(pSeqList pSeq)

{

assert(pSeq);

pSeq->data = (DataType *)malloc(INIT_SIZE*sizeof(DataType));

memset(pSeq->data,0,INIT_SIZE*sizeof(DataType));

pSeq->capacity = INIT_SIZE;

pSeq->size = 0;

}

void CheckCapacity(pSeqList pSeq)

{

assert(pSeq);

if(pSeq->capacity == pSeq->size)

{

//printf("扩容");

pSeq->data = (DataType *)realloc(pSeq->data,(pSeq->capacity+INC)*sizeof(DataType));

pSeq->capacity = pSeq->capacity+INC;

}

}

void PushBack(pSeqList pSeq, DataType x)

{

CheckCapacity(pSeq);

pSeq->data[pSeq->size] = x;

pSeq->size++;

}

void PrintSeqList(SeqList Seq)  //打印

{

int i = 0;

for(i=0;i<Seq.size;i++)

{

printf("%d ",Seq.data[i]);

}

printf("over\n");

}

void Destory(pSeqList pSeq)

{

assert(pSeq);

free(pSeq);

pSeq->data = NULL;

pSeq->size = 0;

pSeq->capacity = 0;

}

void PopBack(pSeqList pSeq)

{

assert(pSeq);

if(pSeq->size == 0)

{

printf("顺序表已空\n");

return;

}

else

{

pSeq->size--;

}

}

void PushFront(pSeqList pSeq, DataType x)

{

int i = 0;

assert(pSeq);

CheckCapacity(pSeq);

if(pSeq->size == 0)

{

pSeq->data[pSeq->size] = x;

pSeq->size++;

}

else

{

for(i=pSeq->size-1;i>=0;i--)

{

pSeq->data[i+1] = pSeq->data[i];

}

pSeq->data[0] = x;

pSeq->size++;

}

}

void PopFront(pSeqList pSeq)

{

int i = 0;

assert(pSeq);

if(pSeq->size == 1)

{

pSeq->size--;

}

else

{

for(i=0;i<pSeq->size;i++)

{

pSeq->data[i] = pSeq->data[i+1];

}

pSeq->size--;

}

}

void Insert(pSeqList pSeq, int pos, DataType x)

{

int j = 0;

assert(pSeq);

CheckCapacity(pSeq);

if(pos<=0 || pos>pSeq->capacity)

{

printf("插入的位置不合法");

return;

}

for(j=pSeq->size-1;j>=pos-1;j--)

{

pSeq->data[j+1]=pSeq->data[j];

}

pSeq->data[pos-1] = x;

pSeq->size++;

}

void Remove(pSeqList pSeq, DataType x)

{

int i = 0;

int j = 0;

assert(pSeq);

if(pSeq->size == 1)

{

pSeq->size--;

return;

}

for(i=0;i<pSeq->size;i++)

{

if(pSeq->data[i] == x)

{

for(j=i;j<pSeq->size;j++)

{

pSeq->data[j] = pSeq->data[j+1];

}

pSeq->size--;

return;

}

}

}

void RemoveAll(pSeqList pSeq, DataType x)

{

int i = 0;

int j = 0;

assert(pSeq);

if(pSeq->size == 1)

{

pSeq->size--;

return;

}

for(i=0;i<pSeq->size;i++)

{

if(pSeq->data[i] == x)

{

for(j=i;j<pSeq->size;j++)

{

pSeq->data[j] = pSeq->data[j+1];

}

pSeq->size--;

}

}

}

void ReverseList(pSeqList pSeq)

{

DataType left = 0;

DataType right = pSeq->size-1;

DataType tmp;

assert(pSeq);

while(left<right)

{

tmp = pSeq->data[left];

pSeq->data[left] = pSeq->data[right];

pSeq->data[right] = tmp;

left++;

right--;

}

}

void SortList(pSeqList pSeq)//冒泡

{

DataType i = 0;

DataType j = 0;

DataType tmp;

assert(pSeq);

for(i=0;i<pSeq->size-1;i++)

{

for(j=0;j<pSeq->size-1-i;j++)

{

if(pSeq->data[j]>pSeq->data[j+1])

{

tmp = pSeq->data[j];

pSeq->data[j] = pSeq->data[j+1];

pSeq->data[j+1] = tmp;

}

}

}

}

int Find(SeqList Seq, DataType x)

{

DataType i = 0;

for(i=0;i<Seq.size;i++)

{

if(Seq.data[i] == x)

{

return i;

}

}

return -1;

}

int BinarySearch(SeqList Seq, DataType x)

{

DataType left = 0;

DataType right = Seq.size-1;

DataType mid = (left+right)/2;

while(left<=right)

{

if(Seq.data[mid]<x)

{

left = mid+1;

}

if(Seq.data[mid]>x)

{

right = mid-1;

}

if(Seq.data[mid] == x)

{

return Seq.data[mid];

}

}

}

#endif  //__SEQ_LIST_H__

“test.c”

#include "Seq_D.h"

void Test1()  //尾插尾删

{

SeqList mylist;

InitSeqList(&mylist);

PushBack(&mylist,1);

PushBack(&mylist,2);

PushBack(&mylist,3);

PushBack(&mylist,4);

//PopBack(&mylist);

PrintSeqList(mylist);

}

void Test2()//头插头删

{

SeqList mylist;

InitSeqList(&mylist);

PushFront(&mylist,1);

PushFront(&mylist,2);

PushFront(&mylist,3);

PushFront(&mylist,4);

//PopFront(&mylist);

PrintSeqList(mylist);

}

void Test3()

{

SeqList mylist;

InitSeqList(&mylist);

PushBack(&mylist,1);

PushBack(&mylist,2);

PushBack(&mylist,3);

PushBack(&mylist,4);

PrintSeqList(mylist);

printf("\n");

Insert(&mylist,2,5);

PrintSeqList(mylist);

}

void Test4()//删除

{

SeqList mylist;

InitSeqList(&mylist);

PushBack(&mylist,1);

PushBack(&mylist,3);

PushBack(&mylist,2);

PushBack(&mylist,3);

PushBack(&mylist,4);

Remove(&mylist, 3);

//RemoveAll(&mylist, 3);

PrintSeqList(mylist);

}

void Test5()//逆置

{

SeqList mylist;

InitSeqList(&mylist);

PushBack(&mylist,1);

PushBack(&mylist,3);

PushBack(&mylist,2);

PushBack(&mylist,3);

PushBack(&mylist,4);

ReverseList(&mylist);

PrintSeqList(mylist);

}

void Test6()//冒泡

{

SeqList mylist;

InitSeqList(&mylist);

PushFront(&mylist,1);

PushFront(&mylist,2);

PushFront(&mylist,3);

PushFront(&mylist,4);

SortList(&mylist);

PrintSeqList(mylist);

}

void Test7()//二分查找

{

SeqList mylist;

DataType ret = 0;

InitSeqList(&mylist);

PushFront(&mylist,1);

PushFront(&mylist,2);

PushFront(&mylist,3);

PushFront(&mylist,4);

ret=Find(mylist,3);

printf("%d ",ret);

/*ret=BinarySearch(mylist,3);

printf("%d ",ret);*/

}

int main()

{

Test7();

return 0;

}

时间: 2024-11-07 19:36:36

顺序表的实现---动态的相关文章

C++的标准模板库STL中实现的数据结构之顺序表vector的分析与使用

摘要 本文主要借助对C++的标准模板库STL中实现的数据结构的学习和使用来加深对数据结构的理解.即联系数据结构的理论分析和详细的应用实现(STL),本文是系列总结的第一篇,主要针对线性表中的顺序表(动态数组)STL vector进行分析和总结. 引言 因为前段时间对台大的机器学习基石和技法课程进行了学习,发如今详细的实现中经常涉及到各种类型的数据结构,比方线性表.二叉树.图等,在使用这些数据结构时感到有些吃力.主要是对一些主要的数据结构理解的不够.所以趁着暑假假期.近期一段时间总会抽出时间复习一

C++ 顺序表实现

线性表就是字面上的意思, 顺序表是线性表基于数组的一种实现, “顺序”这个名字怎么来的并不清楚,可以勉强解释为“存储地址是连续.顺序的”. 另外两种线性表实现分别是“基于链表”和“散列存储”. 顺序表可以是动态的,也可以是静态的, “静态”就是一开始就知道表容量,并且这个容量在之后无法被更改: “动态”就是能够动态的改变表的容量,实现上基于动态内存分配. 基于数组的静态版本: #ifndef SEQLIST_H #define SEQLIST_H const int MAX_SIZE = 512

C++实现动态顺序表

顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构.这样的存储方式使得线性表逻辑上相邻的元素,其在物理存储单元中也是相邻的.只要知道了第一个元素的存储地址,就可以知道线性表中任何一个元素的存储地址.本文利用C++语言,在Windows平台 Visual Studio 2015开发环境下实现.功能:应用C++语言实现顺序表的各项操作.基本的成员函数:构造函数.拷贝构造函数.赋值运算符的重载.析构函数. // 顺序表构造成功之后,里面存放了n个元素

c实现的动态顺序表

第一篇文章中用c实现了静态顺序表,但是使用静态顺序表还有不足的地方.当我们需要存储的数据很少时,如果静态顺序表的数组容量较大就会造成空间的浪费:当我们需要存储的数据很多时,如果静态顺序表的数组容量较小可能就会造成数据丢失.所以一般情况我们应该尽量把顺序表实现成动态的.需要多大容量就开辟多大容量. 静态顺序表和动态顺序表只有以下函数不同: 1.定义结构体时,多定义一个capacity,并对capacity进行初始化和增加大小的设置: #define INIT_CAPACITY 3 #define 

C语言:【动态顺序表】动态顺序表的初始化、打印、尾插PushBack、尾删PopBack

#include<stdio.h> #include<stdlib.h> #include<assert.h> #include<string.h> #include<malloc.h> typedef int DateType; typedef struct SeqList {     DateType *arr;     size_t capacility;     size_t size; }SeqList; //创建空间 void Che

动态顺序表 与 双向链表的模板类

//////////////////////////////////////////////////////////////////////// /////////////////////泛型编程之动态顺序表的模板///////////////////////// //////////////////////////////////////////////////////////////////////// #include<iostream> #include<string> u

实现动态顺序表

SeqList.h #pragma once #include<stdio.h> #include<string.h> #include<assert.h> #include<malloc.h>   typedef int DataType; typedef struct SeqList { DataType* arry; size_t size; size_t capacity; }SeqList;   void check(SeqList*Seq);//

静态顺序表和动态顺序表

实现一个静态顺序表,首先,要定义一个保存数据的数组,保存在结构体中,用size来存储数组中的元素个数, typedef struct SeqList { DataType array[MAX_SIZE]; size_t size; }SeqList; 首先来实现一下静态顺序表的初始化函数,可以借用系统的memset函数来实现,开辟一块空间全部初始化为0,没有存入数据所以size也为0 void InitSeqList(SeqList *pSeq) { assert(pSeq); memset(p

【C语言】静态顺序表和动态顺序表的实现

静态顺序表 定义一张顺序表也就是在内存中开辟一段连续的存储空间,并给它一个名字进行标识.只有定义了一个顺序表,才能利用该顺序表存放数据元素,也才能对该顺序表进行各种操作. 有两种定义顺序表的方法:一是静态地定义一张顺序表:二是动态地生成一张顺序表. 静态地定义一张顺序表的方法与定义一个数组的方法类似.可以描述如下: #define MAX_SIZE 100 typedef int DataType; typedef struct SeqList { DataType array[MAX_SIZE