数据结构_线性表_顺序表 的创建,插入,删除,查找

数据结构的分类,按照元素之间的对应关系可以分为四类基本结构:集合、线性结构、树形结构、图状结构(网状结构)。
树形结构和图形结构全称为非线性结构。
集合结构中的数据元素除了同属于一种类型外,别无其它关系。
线性结构中元素之间存在一对一关系.
树形结构中元素之间存在一对多关系.
图形结构中元素之间存在多对多关系。在图形结构中每个结点的前驱结点数和后续结点数可以任意多个

数据结构按照存储结构分类:
数据结构在计算机中的表示(映像)称为数据的物理(存储)结构。它包括数据元素的表示和关系的表示。数据元素之间的关系有两种不同的表示方法:顺序映象和非顺序映象,并由此得到两种不同的存储结构:顺序存储结构和链式存储结构。

1>顺序存储方法:它是把逻辑上相邻的结点存储在物理位置相邻的存储单元里,结点间的逻辑关系由存储单元的邻接关系来体现,由此得到的存储表示称为顺序存储结构。顺序存储结构是一种最基本的存储表示方法,通常借助于程序设计语言中的数组来实现

2>链接存储方法:它不要求逻辑上相邻的结点在物理位置上亦相邻,结点间的逻辑关系是由附加的指针字段表示的。由此得到的存储表示称为链式存储结构,链式存储结构通常借助于程序设计语言中的指针类型来实现。

3>索引存储方法:除建立存储结点信息外,还建立附加的索引表来标识结点的地址。

4>散列存储方法:就是根据结点的关键字直接计算出该结点的存储地址。

(首先要了解顺序结构,顺序机构就是将表中元素一个接一个的存入一组连续的存储单元中,这种存储结构是顺序结构。
其次要了解线性表的线性
线性表是最基本、最简单、也是最常用的一种数据结构。
线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的(注意,这句话只适用大部分线性表,而不是全部。比如,循环链表逻辑层次上也是一种线性表(存储层次上属于链式存储),但是把最后一个数据元素的尾指针指向了哨位结点)。
我们说“线性”和“非线性”,只在逻辑层次上讨论,而不考虑存储层次,所以双向链表和循环链表依旧是线性表。
在数据结构逻辑层次上细分,线性表可分为一般线性表和受限线性表。一般线性表也就是我们通常所说的“线性表”,可以自由的删除或添加结点。受限线性表主要包括栈和队列,受限表示对结点的操作受限制。
线性表的逻辑结构简单,便于实现和操作。因此,线性表这种数据结构在实际应用中是广泛采用的一种数据结构。)

采用顺序存储结构的线性表简称为“ 顺序表”。

顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构。
线性表采用顺序存储的方式存储就称之为顺序表。

顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。顺序表的存储特点是:只要确定了起始位置,表中任一元素的地址都通过下列公式得到:LOC(ai)=LOC(a1)+(i-1)*L  1≤i≤n 其中,L是元素占用存储单元的长度。

这里写图片描述

1.线性表的定义

#pragma 顺序表的定义
#define MaxSize 100

//1.定义数据类型
typedef int elemtype;
typedef struct {
    //线性数组
    elemtype v[MaxSize];
    //数组的长度
    int len;
}sqlist

思考:如果将学生档案信息表用顺序存储实现,如何定义elemtype呢?

typedef struct {
  int num;
  char name[8];
  char sex[2];
  int age;
  int score;
}elemtype

2.顺序表的创建

    //1.申请内存
    sqlist*L;
    L=(sqlist*)malloc(sizeof(sqlist));
    //2.初始化长度
    L->len=10;

3.顺序表的插入

int insert(sqlist*L,int i,elemtype x) {
     //1.检查插入的位置是否合法
    int j=0;
    if (L->len>=MaxSize) {
        printf("移除\n");
        return 0;
    }else if (i<1||i>L->len+1) {

        printf("插入位置不正确\n");
        return 0;

    } else {
        for (j=L->len-1; j>=i-1; j--)
          //2.插入位置以后的所有元素依次后移
            L->v[j+1]=L->v[j];
            //3.将元素x置入到下标i-1的位置
            L->v[i-1]=x;
            //4.将表的长度加1
            L->len=L->len+1;
        return 1;
    } 
}

4.顺序表求长度

int lenth(sqlist*L) {

    int length;
    length=L->len;
    return length;
}

5顺序表的遍历

void printV(sqlist*L) {

    for (int i=0; i<L->len; i++) {
        printf("v的每个元素为:%d\n",L->v[i]);
    }

}

6.顺序表的删除

int delet(sqlist*L,int i,elemtype *y) {
   //1.检查插入的位置是否合法
    if (lenth(L)==0) {
        printf("空表不能删除");
        return 0;
    }
    int j;
    if (i<1||i>L->len) {
        printf("删除位置不正确!越界删除");
        return 0;
    }else {
        //2删除位置以后的所有的元素依次前移
        for (j=i; j<L->len; j++)
            L->v[j-1]=L->v[j];
            //3表的长度要减1
            L->len=L->len-1;
        return 1;
    }


}

7.顺序表的查找

int searchX(sqlist*L,int x) {

    if (L==NULL||L->len==0) {
        return 0;
    }
    int i;

    for (i=0; i<L->len; i++) {
        if (x==L->v[i]) {
            printf("找到了是%d个元素\n",i+1);

            return 1;
            break;
        }

    }
    return 0;


}

8调用

int main(int argc, const char * argv[]) {
    // insert code here...

    sqlist*L;
    //int lenth(sqlist*L);
    L=(sqlist*)malloc(sizeof(sqlist));
    L->len=10;
    printf("顺序表的长度:%d\n",lenth(L));
    printV(L);
   int sucess= insert(L, 5, 88);

    if (sucess) {
        printf("插入成功\n");
    }else {
        printf("插入失败\n");
    }
    printV(L);
    printf("顺序表的长度:%d\n",lenth(L));

    int a=1234;
    int*p=&a;

    int dele=  delet(L, 7,p );

    if (dele) {
        printf("删除成功\n");
    }else {
        printf("删除失败\n");
    }

    printV(L);
    printf("顺序表的长度:%d\n",lenth(L));

    int search=searchX(L, 1234);

    return 0;
}

9运行结果
这里写图片描述

10顺序表的算法分析

**在线性表中,最频繁的操作是数据元素的比较和移动
1.插入的时间复杂度 T(n)=O(n)
在顺序表上做插入运算平均要移动表中一半的的结点.当n很大的时候,算法效率极低
2.删除算法
平均移动次数 ( n-1) /2 的时间复杂度 T(n)=O(n)
3定位算法
比较的时间复杂度O(n)=T(n)
4求表的长度和读表的元素的算法的时间复杂度O(1)
综上所述:顺序表的插入,删除算法再时间性能方面表现是不理想的**

  • 18
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值