顺序表--数组

顺序表结点的存储地址计算公式:

    第i个数据元素的存储位置:Loc(ai)=Loc(ai)+(i-1)*l;1≤i≤n(l为每个元素需占l个存储单元)

    第(i+1)个数据元素的存储位置Loc(ai+1)和第i个数据元素的存储位置Loc(ai)的关系:Loc(ai+1)=Loc(ai)+l;

数组:

#define  OK   1
#define  ERROR   -1
#define  MAX_SIZE  100
typedef  int  Status ;
typedef  int  ElemType ; 

typedef  struct  sqlist
{
    ElemType  elem_array[MAX_SIZE] ;
    int length ;
} SqList ;

1. 顺序线性表初始化

 Status Init_SqList( SqList *L )
{
    L->elem_array=( ElemType * )malloc(MAX_SIZE*sizeof( ElemType ) ) ;
    if ( !L -> elem_array )
        return  ERROR ;
    L->length= 0 ;
    return OK ;
}

2. 顺序线性表的插入---实现步骤(Einsert=n/2,平均时间复杂度为O(n))
/*
(1) 将线性表L中的第i个至第n个结点后移一个位置。
(2) 将结点e插入到结点ai-1之后。
(3) 线性表长度加1
*/

Status Insert_SqList(Sqlist *L,int i ,ElemType e)
 {
    int j ;
    if( i<1||i>L->length+1)
        return  ERROR ; //i合法值1到length+1
    if(L->length>=MAX_SIZE)
    {
        printf(“线性表溢出!\n”);
        return  ERROR ;
    }
    for( j=L->length–1; j>=i-1; --j )
        L->Elem_array[j+1]=L->Elem_array[j];/*  i-1位置以后的所有结点后移  */
    L->Elem_array[i-1]=e;    /*  在i-1位置插入结点  */
    L->length++ ;
    return  OK ;
}

3 顺序线性表的删除(Einsert=(n-1)/2,平均时间复杂度为O(n))
/*
(1) 将线性表L中的第i+1个至第n个结点依此向前移动一个位置。
(2) 线性表长度减1。
*/

ElemType  Delete_SqList(Sqlist *L,int i)
{
    int  k ;
    ElemType  x ;
    if(L->length==0)
    {
        printf(“线性表L为空!\n”);
        return ERROR;
    }
    if(i<1||i>L->length)
    {
        printf(“要删除的数据元素不存在!\n”) ;
        return ERROR ;
    }
    x=L->Elem_array[i-1] ;   /*保存结点的值*/
    for(k=i; k<L->length; k++)
        L->Elem_array[k-1]=L->Elem_array[k];/*  i位置以后的所有结点前移  */
    L->length--;
    return (x);
} 

4 顺序线性表的查找定位删除---实现步骤(Ecompare=(n+1)/2,Edelete=(n-1)/2,平均时间复杂度:Ecompare+Edelete=n ,即为O(n) )
/*
(1) 在线性表L查找值为x的第一个数据元素。
(2) 将从找到的位置至最后一个结点依次向前移动一个位置。
(3) 线性表长度减1。
*/

Status  Locate_Delete_SqList(Sqlist *L,ElemType x)/*  删除线性表L中值为x的第一个结点  */
{
    int  i=0 , k ;
    while(i<L->length)      /*查找值为x的第一个结点*/
    {
        if(L->Elem_array[i]!=x )
            i++ ;
        else
       {
            for ( k=i+1; k< L->length; k++)
               L->Elem_array[k-1]=L->Elem_array[k];
            L->length--;  break ;
       }
    }
    if  (i>L->length)
    {
        printf(“要删除的数据元素不存在!\n”) ;
        return ERROR ;
    }
    return  OK;
} 

动态数组:

typedef struct
{
        ElemType *elem;     //存储空间基址
        int length;                //当前长度
        int listsize;               //当前分配的存储容量(以sizeof(ElemType )为单位)
}SqList;

创建顺序表(数组):

status Init(SqList &l){
    l.elem=(ElemType *)malloc(初始长度*sizeof(ElemType ));
    if(!l.elem) exit(0);
    l.length=0;
    l.listsize=初始长度;
    return ok;
}  

插入:

status insertlist(SqList *L,int i,ElemType e)   //第i的位置插入元素
{
    if(i<1||i>L.length+1)                    //下表为0的作为哨兵,不放数据。判断i是否合法
        return error;
    if(L.length>=L.listsize)             //存储空间已满,增加分配空间
    {
        newbase=(ElemType *)realloc(L.elem,(L.listsize+增量)*sizeof(ElemType ));//L.elem原指针的位置
        if(!newbase)                              //存储分配失败
            exit(0);
        L.elem=newbase;                           //新基址
        L.listsize+=增量;                          //增加存储容量
    }
    q=&(L.elem[i-1]);                        //p插入的位置
    for(p=&(L.elem[length-1]);p>=q;--p)
    *(p+1)=*p;                             //指针移动
    *q=e;                                  //插入元素
    ++L.length;                            //表长加一
    return ok;
}   

删除:

status deletlist(SqList *L,int i,ElemType e)
{
  if(i<1||i>L.length)                    //下判断i是否合法
    return error;
    p=&(L.elem[i-1]);                        //删除元素的位置
    e=*p;                     //删除元素的值
  q=L.elem+L.elem+Llength-1;               //表尾的位置
  for(++p;p<=q;++p)
    *(p-1)=*p;                //元素左移
  --L.length;                              //表长减一
  return ok;
}
时间: 2024-11-05 18:57:55

顺序表--数组的相关文章

词典的实现(2)-借助顺序表(数组)实现词典

一,思路 1,词典实现类ArrayDictionary.java肯定要implements 词典的接口DictionaryInterface.java(参考:http://www.cnblogs.com/hapjin/p/4573826.html).其次,为了序列化,还要implements Serializable接口 2,由于词典中的每个元素是一个键值对.因此,需要将查找键 和 值 封装在同一个对象中,因而定义了Entry.java来表示词典中的每个元素.其中,Entry类是作为ArrayD

顺序表(数组)和链表的比较

特点对比: 1.存取方式上,数组可以顺序存取或者随机存取,而链表只能顺序存取: 2.存储位置上,数组逻辑上相邻的元素在物理存储位置上也相邻,而链表不一定: 3.存储空间上,链表由于带有指针域,存储密度不如数组大: 4.按序号查找时,数组可以随机访问,时间复杂度为O(1),而链表不支持随机访问,平均需要O(n): 5.按值查找时,若数组无序,数组和链表时间复杂度均为O(1),但是当数组有序时,可以采用折半查找将时间复杂度降为O(logn): 6.插入和删除时,数组平均需要移动n/2个元素,而链表只

C++ 数据结构学习一(顺序表)

//sequentiallist.h 顺序表模板类 #ifndef SEQUENTIAL_LIST_HXX#define SEQUENTIAL_LIST_HXX using std::cout; using std::endl; const int MaxSize=100; //顺序表数组最大值 template<class T>class SeqList //定义模板类SeqList(顺序表){ public: SeqList() { length=0; } //无参构造函数,建立一个空的顺

数据结构 --- 02. 内存, 顺序表, 单链表

一.内存 1.基本概念 计算机的作用: 就是用来存储和运算二进制的数据 变量的概念: 就是计算机中的某一块内存空间   衡量计算机内存大小的范围: bit byte kb mb 计算机中内存空间都会有两个基本的属性 大小 地址 不同数据占用内存空间的大小 整数:4byte float:4byte double:8byte 字符:1byte 理解a=10的内存图(引用,指向) 指向:如果一个变量存储了某一块内存空间的地址,则表示该变量指向该块内存 引用:如果一个变量存储了某一块内存空间的地址,则该

使用JAVA数组实现顺序表

1,引入了JAVA泛型类,因此定义了一个Object[] 类型的数组,从而可以保存各种不同类型的对象. 2,默认构造方法创建了一个默认大小为16的Object数组:带参数的构造方法创建一个指定长度的Object数组 3,实现的顺序表的基本操作有:返回表的长度.获取指定索引处的元素(注意是索引,而不是位置.索引以下标0开始,位置以下标1开始).按值查找数据元素的位置.直接插入元素(顺序表尾部).向指定位置插入元素.直接删除元素(在顺序表尾部).删除指定索引处元素.判断表是否为空.清空表. 1 im

基于动态分配的数组的顺序表(兼具Boost单元测试)

我们利用静态分配的数组来实现的顺序表的局限还是挺大的,主要在于它的容量是预先定好的,用户不能根据自己的需要来改变.如果为了后续用户能够自己调整顺序表的大小,动态地分配数组空间还是很有必要的.基于动态分配的数组的顺序表绝大部分跟基于静态分配的数组的顺序表是一样的,只需在后者程序上改动一小部分即可. 第一,我们不需定义一个容量常量CAPACITY,而是定义一个私有变量myCapacity. 第二,类的构造函数需要改进一下.我们需要类在被实例化时自动申请内存,即需添加下边程序: ElementType

【C语言】顺序表,数组

顺序表的搭建,就是一个本身的结构,利用的是数组,开辟的内存空间大小是固定的.没有链式结构那样的开辟空间的可控性.最基本的数据结构认知. 然后我们来看看数据结构中的基本实现和思想: #include "seqList.h" #include <stdio.h> #include <assert.h> //顺序表的初始化 void InitSeqList(SeqList* seq) { int _index = 0; assert(seq); for(;_index

顺序表与数组的区别和联系

顺序表是在计算机内存中以数组的形式保存的线性表. 顺序表是指用一组地址连续的存储单元依次存储数据元素的线性结构.线性表采用顺序存储的方式存储就称之为顺序表,顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中.线性表采用指针链接的方式存储就称之为链表. 线性表是从逻辑结构的角度来说的,除了头和尾之外,它的每一个元素都只有一个前驱元素和一个后驱元素.各种队列(单向.双向.循环队列),栈等都是线性表的不同例子. 而数组是从物理存贮的角度来说的,线性表可以用数组存贮也可以用链表来存贮.同

5-3-行逻辑链接的顺序表(稀疏矩阵)-数组和广义表-第5章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第5章  数组和广义表 - 行逻辑链接的顺序表(稀疏矩阵) ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? Status.h.Scanf.c        相关测试