数据结构和算法 (Algorithm)- 线性结构

目录


title: 数据结构和算法-day2
date: 2018-10-07 19:08:02
tags: 算法
categories: 算法
img: https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1539066969226&di=d0ecf508fdab9370a396a5a6297a0bdb&imgtype=0&src=http%3A%2F%2Fimg.zcool.cn%2Fcommunity%2F0117e2571b8b246ac72538120dd8a4.jpg%401280w_1l_2o_100sh.jpg
---

数据结构和算法 (Algorithm)- 线性结构

        线性结构的基本特征是:在数据元素的非空有限集中,有且仅有一个元素没有前驱,有且仅有一个数据元素没有后继;其余数据元素有且仅有只有一个直接的前驱和后继。

例如:   *---------------------------------*

线性表

      线性表是由同一类型的数据元素构成的线性结构,特点是:数据元素间呈一种线性关系。线性表是具有相同数据类型的n个数据元素的有限序列,通常记为:

(a1,a2,a3,······,a(i-1),ai,a(i+1),······,an)

线性表抽象数据类型

ADT List{

数据对象: D={ai| ai(-ElemSet,i=1,2,...,n,n>=0}

数据关系: R1={i-1,ai>| ai-1,ai(- D,i=2,...,n}

基本操作:
InitList(&L)        //初始化
DestroyList(&L)     //删除
ListInsert(&L,i,e)  //插入
ListDelete(&L,i,&e) //删除指定元素

}ADT List

线性表有两种存储结构:

      ①定长的顺序存储结构——向量型的一维数组结构

      ②变长的线性表存储结构——链接式存储结构,动态数组,顺序文件

线性表的顺序存储以及运算实现

      众人皆知的数组,其实就是以顺序结构存储数据的线性表。

顺序表示例图:

顺序表结构算法:

#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#define MAXSIZE 20          // 顺序表的最大存储容量
typedef int datatype;       // 顺序表存储的数据类型
typedef struct{
    datatype data[MAXSIZE]; //线性表存储数据
    int Last;               //线性表的长度
}SeqList;
//定义一个顺序表 SeqList L;
//定义一个SeqList类型的指针 SeqList *L;
SeqList * init_SeqList(){   //初始化线性表
    SeqList *L;
    L = (SeqList *)malloc(sizeof(SeqList));
    L->Last=0;
    return L;
}
int main(){
    int i;
    SeqList *L = init_SeqList();
    for(i=0;i<10;i++){
        L->data[i]=i;
        L->Last +=1;
    }
    printf("当前顺序表的长度为 %d,顺序表的大小为 %d",L->Last,sizeof(L->data));
} 

      顺序表应用举例:有顺序表A,B,其元素均按从小到大的升序排列,编写一个算法将他们合并成一个顺序表C,要求C的元素也是从小到大的升序排列。

      算法思路:依次扫描A和B中的元素,比较当前元素的值,将较小值的元素赋给C,直到一个线性表扫描完毕之后将未完的那个顺序表中余下的那部分赋给C,且C的容量需要能够容纳A,B两个线性表相加的长度,算法如下

void merge(SeqList A,SeqList B,SeqList *c){
   int i,j,k;
   i=0;j=0;k=0;
   while(i<=A.last&&j<=B.last){
       if (A.data[i]<B.data[i])
           C->data[k++]=A.data[i++];
       else
           C->data[k++]=B.data[i++];
   while(i<=A.last)
       C->data[k++]=A.data[i++];
   while(i<=B.last)
       C->data[k++]=B.data[i++];
   C->last=k-1;
       
   }
}

顺序表的优缺点:

线性表的顺序存储结构,在存、读取数据时,不管是在哪个位置,时间复杂度都是O(1)。而在插入或者删除时,时间复杂度都是O(n)。

这也就是线性表的顺序存储结构比较适合存取数据,不适合经常插入和删除数据的应用。

优点:

1.无需为了表示表中元素之间的逻辑关系而增加额外的存储空间(相对于链式存储而言)。

2.可以快速的存取表中任意位置的元素。

缺点:

1.插入和删除操作需要移动大量的元素。

2.当线性表长度变化较大时,难以确定存储空间的容量。

3.容易造成存储空间的“碎片”(因为线性表的顺序存储结构申请的内存空间都以连续的,如果因为某些操作(比如删除操作)导致某个部分出现了一小块的不连续内存空间,因为这一小块内存空间太小不能够再次被利用/分配,那么就造成了内存浪费,也就是“碎片”)

参考 https://www.cnblogs.com/wsnb/p/5191518.html

线性表的链式存储和运算实现

      顺序表最大的缺点是移动数据元素需要耗费许多时间,影响操作效率。正是因为顺序表的特性,相邻两元素之间的数据存在相邻的关系,使得插入删除的操作麻烦了许多。

      而链式存储方法不需要用地址连续的存储单元来实现,从而可以使得逻辑相邻的两数据元素在物理上不相邻,但有优点就有缺点,链式存储方法不能进行随机存取。

      而链表又有单链表,循环链表,双向链表,静态链表的区别。

队列

数组

待更新。。。。

猜你喜欢

转载自www.cnblogs.com/yof3ng/p/9769509.html