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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Haihao_micro/article/details/52416851

顺序存储结构:元素按顺序连续存储。

一般它的定义存储格式为:

//定义数据格式
typedef struct {

    ElemType data[MAXSIZE];   //数组存储元素
    int length;               //线性表的长度

}SqList; 

在读取顺序表的元素,不管哪个位置它的算法时间复杂度都为O(1),当插入或删除一个元素的时候,它的时间复杂度为O(n).

以下为C语言代码的简单实现:

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

#include <io.h>
#include <math.h>
#include <time.h>

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0

#define MAXSIZE 20

typedef int Status;                  /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
typedef int ElemType;                 /* ElemType类型根据实际情况而定,这里假设为int */

//定义数据格式
typedef struct {

    ElemType data[MAXSIZE];
    int length; 

}SqList; 


//初始化顺序线性表 
Status InitList(SqList *L){

    L->length=0;
    return OK;

}




//判断线性表是否为空
Status ListisEmpty(SqList L){

    if(L.length==0){
        return TRUE;
    }else{
        return FALSE;
    }

} 

//重置清空 
Status ClearList(SqList *L){
    L->length =0;
    return OK;
} 

//查找第i个元素,并将元素返回给*e 
Status GetEle(SqList L,int i,ElemType *e){

    if(L.length==0 || i<1 || i>L.length){
        return ERROR;
    }

    *e = L.data[i-1];
    return OK;

} 


//查找元素的所在的位置
int LocationEle(SqList L,ElemType e){

    int i;
    if(L.length==0){
        return 0;
    }

    for(i=0;i<L.length;i++){
        if(L.data[i]==e){
            break;
        }
    }

    if(i>L.length){
        return 0;
    }

    printf("元素%d在第%d个位置\n",e,i+1);
    return 1;



} 


int isLocate( SqList L,ElemType e){

    int isLocate = 0; 

    int i;
    for(i=0;i<L.length;i++){
        if(L.data[i]==e){
            isLocate = 1;
        }
    }


    return isLocate;


}

//插入元素操作
Status ListInsert(SqList *L,int i,ElemType e){

    int k;
    if(L->length==MAXSIZE){
        return ERROR;
    }

    if(i<1 || i>L->length+1){
        return ERROR;
    }

    if(i<=L->length){  

        for(k=L->length-1;k>=i-1;k--){          //在i之后的元素全部向后移动一位 

            L->data[k+1] = L->data[k];
        }
    }

    //将新元素插入
    L->data[i-1] = e;
    //长度加1 
    L->length++;

    return OK; 
}

//删除元素操作

Status ListDelete(SqList *L,int i,ElemType *e){
    int k;
    if(L->length==0){
        return ERROR; 
    }
    if(i<1 || i>L->length+1){
        return ERROR;
    }

    *e = L->data[i-1];
    printf("被删除的元素为:%d\n",*e);


    if(i<=L->length){

        for(k=i;k<L->length;k++){
            L->data[k-1] = L->data[k];                 //删除的元素后面所有元素向前移动 
        }
    }

    L->length--;
    return OK;
}


//遍历线性表操作
int ListVisit(SqList *L){

    int i;

    if(L->length==0){
        printf("该线性表为空\n"); 
    }



    for(i=0;i<L->length;i++){

        printf("%d ",L->data[i]);

    }

    printf("\n");
    return OK;

}

//两个顺序线性表的合并操作
void unionL(SqList La,SqList Lb){

    int la_len,lb_len,i;

    ElemType e;

    la_len = La.length;
    lb_len = Lb.length;

    for(i=1;i<=lb_len;i++){

        GetEle(Lb,i,&e);

        if(!isLocate(La,e)){

            ListInsert(&La,++la_len,e);

        }

    }


    //合并后的线性表为
    printf("合并后的线性表:\n");
    ListVisit(&La);



}



    int main(){

        SqList L;
        SqList Lb;

        ElemType e;
        Status i;

        int j,k;


        i = InitList(&L);

        printf("初始化的L的长度为L.length = %d\n",L.length);

        //插入

        for(j=1;j<=5;j++){

            ListInsert(&L,1,j); 

        }

        printf("在表头插入的数据L.data为:\n");

        //遍历插入的数据 
        ListVisit(&L);

        printf("\n");


        //读取一个元素
        GetEle(L,2,&e);
        printf("你要查找的第二个元素为 %d\n",e);

        //插入一个元素,第二个位置插入6 
        ListInsert(&L,2,6); 
        printf("插入后的线性表为:\n");
        ListVisit(&L);


        //查找元素的位置
        LocationEle(L,6);

        //删除一个元素
        ListDelete(&L,2,&e); 

        printf("删除元素后的线性表为:\n");    
        ListVisit(&L);


        //初始化Lb
        InitList(&Lb);

        //给Lb赋值,创建一个新的线性表
        for(j=6;j<=15;j++){
            ListInsert(&Lb,1,j);
        }

        //遍历
        printf("Lb的数据为Lb.data:\n");
        ListVisit(&Lb);


        //合并两个线性表,将第二个线性表 合并到第一个线性表 
         unionL(L,Lb);


        //清空重置线性表 
        ClearList(&L);
        ClearList(&Lb);

        ListVisit(&L);
        ListVisit(&Lb);

    }

这里写图片描述

猜你喜欢

转载自blog.csdn.net/Haihao_micro/article/details/52416851