线性表的顺序存储结构

线性表的顺序存储结构

先上代码:

#include "Sqlist.h"
//各个函数的具体实现
int Init_SqList(SqList* L){
    for(int i = 0;i < MAXSIZE;i++)
        L->data[i] = 0;

    L->length = 0;

    return 0;
}

int Get_Elem(SqList* L,int i,ElemType* e){
    if(L->length == 0 || i < 1 || (i > L->length))
        return -1;
    *e = L->data[i-1];
    return 0;
}

int Insert_Elem(SqList* L,int i,ElemType e){
    int k = 0;
    if(L->length == MAXSIZE)
        return -1;
    if((i > (L->length) + 1) || i < 1)
        return -1;
    if(i <= L->length){
        for(k = L->length -1;k >= i-1;k--)
            L->data[k+1] = L->data[k];
    }
    L->data[i-1] = e;
    L->length++;
    return 0;
}

int Delete_Elem(SqList* L,int i,ElemType* e){
    int k = 0;
    if(L->length == 0)
        return -1;
    if((i > L->length) || i < 1)
        return -1;
    *e = L->data[i-1];
    if(i < L->length){
        for(k = i;k < L->length;k++)
            L->data[k-1] = L->data[k];
    }
    L->length--;
    return 0;
}

int Search_Elem(SqList* L,ElemType e){
    int i = 0;
    if(L->length == 0)
        return -1;
    for (i = 0;i < L->length;i++){
        if(e == L->data[i])
            return i+1;
    }
    return -1;
}

int Modify_Elem(SqList* L,int i,ElemType e){
    if(L->length == 0)
        return -1;
    if((i > L->length) || i < 1)
        return -1;
    if(i < L->length){
        L->data[i-1] = e;
    }
    return 0;
}

#ifndef __SQLIST_H_
#define __SQLIST_H_

#define MAXSIZE 20
typedef int ElemType;
typedef struct{
    ElemType data[MAXSIZE];
    int length;
} SqList;

int Init_SqList(SqList* L);
int Get_Elem(SqList* L,int i,ElemType* e);
int Insert_Elem(SqList* L,int i,ElemType e);
int Delete_Elem(SqList* L,int i,ElemType* e);
int Search_Elem(SqList* L,ElemType e);
int Modify_Elem(SqList* L,int i,ElemType e);
#endif // __SQLIST_H_

#include <stdio.h>
#include <stdlib.h>
#include "Sqlist.h"

int main(){
    SqList L;
    int i = 0;
    int e = 0;
    Init_SqList(&L);
    for(i = 1;i <= 10;i++)
    {
        Insert_Elem(&L,i,10-i);
    }
    for(i = 1;i <= 10;i++)
    {
       Get_Elem(&L,i,&e);
       printf("%d\n",e);
    }
    e = 5;
    if(Search_Elem(&L,e) == 0)
        printf("e = %d in the SqList\n",e);

    Delete_Elem(&L,5,&e);

    if(Search_Elem(&L,e) == 0)
        printf("e = %d in the SqList\n",e);
        else{
            printf("e = %d not in the SqList\n",e);
        }
    Insert_Elem(&L,5,12);
    for(i = 1;i <= 10;i++)
    {
       Get_Elem(&L,i,&e);
       printf("%d\n",e);
    }
    Modify_Elem(&L,5,20);
    for(i = 1;i <= 10;i++)
    {
       Get_Elem(&L,i,&e);
       printf("%d\n",e);
    }
}

正文:

线性表的顺序存储结构,指的是用一段连续的地址依次存储线性表的数据元素。

因为线性表的元素类型相同,所以可以用一维数组来实现顺序存储结构。

  1. 结构代码

    #define MAXSIZE 20
    typedef int ElemType;
    typedef struct{
        ElemType data[MAXSIZE];
        int length;
    } SqList;
    

    三个重要属性:

    • 存储空间的起始位置:数组data
    • 最大存储容量,及数组长度
    • 线性表当前的长度,任意时刻小于等于数组长度
  2. 插入操作

    • 如果链表已满,则返回异常
    • 如果插入位置不合理,返回异常
    • 从最后一个元素开始向前遍历到插入位置,分别将它们都向后移动一个位置
    • 插入元素
    • 表长加一
  3. 删除操作

    • 如果删除位置不合理,返回异常
    • 如果链表为空,返回异常
    • 取出删除元素
    • 从删除元素开始向前遍历到最后一个元素,分别将它们都向前移动一个位置
    • 表长减一
  4. 其他操作比较简单,就不再赘述

  5. 时间复杂度为O(n)

  6. 优点:

    • 结构简单
    • 操作迅速
  7. 缺点:

    • 插入与删除操作需要移动大量元素
    • 难以确地暗存储空间,容易造成存储空间的“碎片”