线性表的顺序存储结构——顺序表

一.基本运算的实现

1.建立顺序表

void CreateList(SqList * & L,ElemType a[],int n)  //由a中的n个元素建立顺序表
{
    int i = 0,k = 0;  //k表示L中的元素个数,初始值为0
    L = (SqList *)malloc(sizeof(SqList));  //分配线性表的空间
    while(i < n)
    {
        L->data[k] = a[i];  //将元素a[i]存放到L中
        k++;
        i++;
    }
    L->length = k;  //设置L的长度K
}

/* malloc(sizeof(数据类型))   功能:分配存储空间   返回值:所分配的内存区地址 */

2.初始化线性表

void InitList(SqList * & L)
{
    L = (SqList * )mallc(sizeof(SqList);  //分配存放线性表的空间
    L -> lenght = 0;
}

/* 1.&代表引用型指针,类似于地址共享。需要对主函数的值进行修改时,就要用&引用。   2.(SqList *)为强制转换,强制malloc分配为SqList的空间大小。 */

3.销毁线性表

void DestroyList(SqList * & L)
{
    free(L);  //释放L所指的顺序表空间
}

// 若不进行销毁,尽管系统会自动释放顺序表指针变量L,但不会自动释放L所指向的存储空间,如此可能会造成内存泄漏。 

4.判断线性表是否为空表

bool ListEmpty(SqList * L)
{
    return(L -> length == 0);
}// 这里的“空”指空闲,不等于空白。只要L -> length == 0即为空表,不管表中是否有数据。

5.求线性表的长度

int ListLength(SqList * L)
{
    return(L -> length);
}

6.输出线性表

void DispList(SqList * L)
{
    int i = 0;
    for(i=0;i<L -> length;i++)
        printf("%d ",L -> data[i]);
    printf("\n");
}

7.求线性表中的第i个元素的值

bool GetElem(SqList * L,int i,ElemType &e)
{
    if(i<1 || i>L -> length)
        return false;
    e = L -> data[i-1];
    return true;
}

8.查找第一个与e相等的元素

int LocateElem(SqList * L,ElemType e)
{
    int i = 0;
    while(i<L -> length && L -> data[i]!=e)
        i++;
    if(i>=L -> length)
        return 0;
    else
        return i+1;
}

9.在第i个位置上插入新数据

void ListInsert(SqList * & L,int i,ElemType e)
{
    int j;
    if(i<1 || i>L -> length+1)
        return false;
    i--;
    for(j=L -> length;j>i;j--)
        L -> data[j] = L ->data[j-1];
    L -> data[i] = e;
    L -> length++;
    return true;
}

10.删除第i个数据元素

bool ListDelete(SqList * & L,int i,ElemType &e)
{
    int j;
    if(i<1 || i>L -> length)
        return false;
    i--;
    e = L -> data[i];
    for(j=i;j<L -> length-1;j++
        L -> data[j] = L -> data[j+1];
    L -> length--;
    return true;
}

二.应用示例

1.假设一个线性表采用顺序表表示,设计一个算法,删除其中所有制等于x的元素。要求算法的时间复杂度为O(n),空间复杂度为O(1).

//解法一
void delnode1(SqList * & L,ElemType x)
{
    int k=0,i;  //k记录不等于x的元素个数,即要插入到L中的元素个数
    for(i=0;i<L -> length;i++)
        if(L -> data[i] != x)  //若当前元素不为x,将其插入到L中
        {
             L -> data[k] = L -> data[i];
             k++;
        }
    L -> length = k;
}

//解法二
void delnode2(SqList * & L,ElemType x)
{
    int k=0,i=0;  //k记录等于x的元素个数
    while(i<L -> length)
    {
         if(L -> data[i]==x)  //当前元素为x时k增1
             k++;
         else  //当前元素不为x时将其前移k个位置
             L -> data[i-k] = L-> data[i];
         i++;
    }
    L -> length -= k;
}

2.有一个顺序表L,假设元素类型ElemType为整型,设计一个尽可能高效的算法,以第一个元素为分界线(基准),将所有小于等于它的元素一道该基准的前面,将所有大于它的元素移到该基准的后面。

//解法一
int partiton1(SqList * & L)
{
    int i=0,j=L->length-1;  //以data[0]为基准
    ElemType pivot = L->data[0];
    while(i < j)  //从区间两端交替向中间扫描,直到i=j为止
    {
        while(i<j && L->data[j]>pivot)  //从右向左扫描,找一个小于等于pivot的元素
            j--;
        while(i<j && L->data[i]<=pivot)  //从左向右扫描,找一个大于pivot的元素
            i++;
        if(i < j)
            swap(L->data[i],L->data[j]);
    }
    swap(L->data[0],L->data[i]);
}

//解法二
void partition2(SqList * & L)
{
    int i=0,j=L->length-1;
    ElemType pivot = L->data[0];  //以data[0]为基准
    while(i < j)  //从区间两端交替向中间扫描,直到i=j为止
    {
        while(i<j && L->data[j]>pivot)
             j--;   //从右向左扫描,找一个小于等于pivot的data[j]
        L->data[i] = L->data[j];   //找到这样的data[j],放入data[i]处
        while(i<j && L->data[i]<=pivot)
             i++;   //从左向右扫描,找一个大于pivot的data[i]
        L->data[j] = L->data[i];   //找到这样的data[i],放入data[j]处
    }
     L->data[i] = pivot;
}        

3.有一个顺序表L,假设元素类型ElemType为整型,设计一个尽可能高效的算法,将所有奇数移动到偶数的前面。

//解法一
void move1(SqList * & L)
{
    int i=0,j=L->length-1;
    while(i < j)
    {
        while(i<j && L->data[j]%2==0)
            j--;  //从右向左扫描,找一个奇数元素
        while(i<j && L->data[i]%2==1)
            i++;  //从左向右扫描,找一个偶数
        if(i < j)
            swap(L->data[i],L->data[j]);
    }
}

//解法二
void move2(SqList * & L)
{
    int i=-1,j;
    for(j=0;j<=L->length-1;j++)
        if(L->data[j]%2 == 1)
        {
            i++;  //奇数区间个数增1
            if(i != j)
                swap(L->data[i],L->data[j]);
        }
}

原文地址:https://www.cnblogs.com/ljlzl/p/10896311.html

时间: 2024-10-29 19:11:55

线性表的顺序存储结构——顺序表的相关文章

线性表的顺序存储结构之顺序表类的实现_Java

在上一篇博文--线性表接口的实现_Java中,我们实现了线性表的接口,今天让我们来实现线性表的顺序存储结构--顺序表类. 首先让我们来看下顺序表的定义: 线性表的顺序存储是用一组连续的内存单元依次存放线性表的数据元素,元素在内存的物理存储次序与它们在线性表中的逻辑次序相同,即元素ai与其直接前驱ai-1及直接后继ai+1的存储位置相邻.顺序存储的线性表也成为顺序表(sequential list). 顺序表类SeqList提供线性表基于顺序存储结构的一种实现,它有两个私有成员变量table和n,

线性表的顺序存储结构

1.顺序表: 线性表占用的存储空间=n*sizeof(ElemType) n为线性表的长度,ElemType为线性表的元素类型,sizeof(ElemType)为每个元素所占存储空间大小(即字节数) 线性表的顺序存储结构利用数组实现,数组的基本类型是线性表中元素类型,数组大小大于等于线性表的长度. 基本运算实现: (1)建立顺序表 void CreateList(SqList *&L,ElemType a[],int n)    //由a中的n个元素建立顺序表 {  int i;    L=(S

线性表之顺序存储结构实现(上)

一,线性表的概念以及数学定义 1.线性表的概念 零个或多个数据元素的有限序列.首先说明这是一个序列,也就是说数据元素之间是有顺序的,若元素存在多个,则第一个元素无前驱,最后一个元素无后继,其他每个元素都有且仅有一个前驱和后继. 2.数学定义 若将线性表记为(a1...ai-1,ai,ai+1....an),则线性表中,ai-1领先于ai,ai领先于ai+1,则称ai-1是ai的直接前驱元素,ai+1是ai的直接后继元素,当i=1,2....n-1的时候,ai有且仅有一个直接后继元素,当i=2,3

02.线性表(一)顺序存储结构

顺序存储结构 一.线性表基本概念 1.线性表定义 线性表(list)是指零个或多个数据元素的有限序列,所有数据元素为相同数据类型且一个数据元素可以由多个数据项组成.若将线性表记为(a1,..ai-1,ai,ai+1...,an),线性表元素的个数n(n>0,n=0时为空表)定义为线性表的长度,其中ai-1是ai 的直接前驱元素,ai+1是ai的直接后继元素. 2.线性表的抽象数据类型 ADT 线性表(List) Data 线性表的数据对象集合为{a1,a2,....an},每个元素的类型均匀Da

数据结构之线性表之顺序存储结构(3)

1 前言 经过前两张的理论基础,我相信大家都能简单的明白了数据结构和算法一些常用的概念了,从今天开始我们开始学习数据结构中线性表,一起叩响数据结构的大门. 2 详述 线性表(List):零个或者多个数据元素的有限序列. 如果用数学语言来进行定义: (声明:由于下标不是很好弄出来,所以只能表示下面这种方式了,请见谅!) 若线性表记作(a1,...ai-1,ai,ai+1,...,an),则表中ai-1领先于ai,ai领先于ai+1,称ai-1是ai的直接前驱元素,ai+1是ai的直接后继元素.当i

《大话数据结构》笔记(2)--线性表的顺序存储结构

线性存储结构的Java实现代码: https://github.com/Lyu0709/data-structure/tree/master/src/com/coding/basic/array 第三章 线性表 定义 数学语言 若将线性表记为(a1, ..., ai-1, ai, ai+1, ..., an),则表中ai-1领先于ai,ai领先于ai+1,称ai-1是ai的直接前驱元素,ai+1是ai的直接后继元素.当i=1,2,..,n-1时,ai有且仅有一个直接后继,当n=2,3,...,n

线性表的顺序存储结构和链式存储结构

前言 上一篇<栈>中提到了栈的顺序存储结构和链式存储结构,现在就对此做个简单的比较.因为栈是线性表的一种,顺序存储结构和链式存储结构实际是线性表的两种存储方式.而栈和队列都是两种重要的线性表结构.所以本文标题直接为线性表的顺序存储结构和链式存储结构. 开始比较两种不同的存储方式 一.顺序存储结构(也可称为顺序表) 顺序表的特点是逻辑上相邻的数据元素,物理存储位置也相邻,并且,顺序表的存储空间需要预先分配. 优点: (1)方法简单,各种高级语言中都有数组,容易实现. (2)不用为表示节点间的逻辑

数据结构之线性表(顺序存储结构)

小学生放学都是要按顺序排队的,一个接一个,每个小学生的前后位置是固定的,这样便于迅速清点. 其实这就是一个线性表,从这件事里我们就可以找到很多关于线性表的特性,如 1.线性表是一个序列,它是有顺序的(排队) 2.第一个元素无前驱,最后一个无后继,其他每个元素都有一个前驱和后继(一个接一个) 3.元素是有限的(小学生的个数是有限的) 4.数据类型都相同(都是小学生在排队) 说明白线性表示什么,下面我们直接看线性表的实现 线性表的实现分顺序存储结构和链式存储结构 顺序存储结构: #define LI

第6课 - 线性表的顺序存储结构及实现

1. 线性表的顺序存储结构 [顺序存储结构定义] 线性表的顺序存储结构,指的是用一段地址连续的存储单元依此存储线性表中的数据元素. [设计思路] 可以用一维数组来实现顺序存储结构的线性表. 1 template <typename T> 2 class SeqList : public List<T> 3 { 4 protected: 5 T *m_array; //顺序存储空间 6 int m_length; //当前线性表长度 7 }; [顺序存储线性表类的组成] DTLib顺