线性表
结构体
结构体基本概念:结构体属于用户自定义的数据类型,允许用户存储不同的类型。
结构体定义与使用:
语法:
struct 结构体名{
结构体成员列表
};
通过结构体创建变量的三种方式:
struct 结构体名 变量名
struct 结构体名 变量名= {成员1值,成员2值……}
定义结构体时顺便创建变量
结构体变量利用操作符“.”访问成员
线性结构:线性表分为数组和链表
概念:线性表所示最基础的,最常见的一种数据结构。
前驱元素:若A元素在B元素的前面,则称A 为B的前去元素。
后继元素:若B元素在A元素的后面,则称B为A的后继元素。
特征:数据元素之间只有一对一的关系
头结点:第一个数据元素没有前驱
尾结点:最后一个数据元素没有后继
线性表的分类:
线性表分为两种不同的存储数据的方式:顺序表(数组)和链表。
顺序表(数组):
顺序表是以数组的形式进行存储
优点:查询速度快,时间复杂度为O(1)
缺点:插入速度慢,时间复杂度为O(n)
表中元素的个数需要提前定义
下标从0开始
特点:
逻辑地址相邻,物理地址也相邻
顺序表基本操作的功能实现:
1.线性表的静态定义:
#define MaxSize 100;//定义顺序表最大长度 typedef struct{ ElemType data[MaxSize]; int lengh; //当前顺序表的长度 }SqlList;//顺序表的类型定义
2.线性表的静态初始化:
void InitList(SqlList &L){ for(int i=0;i<MaxSize;i++) L.data[i]=0;//防止“脏数据” L.lengh=0; }
3.线性表的插入:
bool ListInsert(SqlList &L,int i,ElemType e){ if(i<1||i>L.length) //判断i值是否合法 return false; if(L.lengh>L.MaxSize)//判断 return false; for(int j=L.lengh;j>=i;j--) L.data[j]=L.data[j-1]; L.data[j-1]=e; L.lengh++; return true; }
4线性表的删除:
bool ListDelete(SqlList &L,int i,Element &e){ if(i<1||i>L.lengh) return false; e=L.data[i-1]; for(int j=i;j<L.lengh;j++) L.data[j-1]=L.data[j]; L.length--; return true; }