今天还算起的还早,八点差不多就爬了起来了,昨天十点就要睡的,玩了一会手机,又到了十一点啦,只要把手机放到枕头旁边肯定会玩的很晚。。。
昨天学完栈,做了做后面的习题,发现前面学的链表几乎全部忘记了233,现实版学了前面忘了后面,连链表的概念都有点挤不太清楚了。。。于是今天来把前面链表的知识复习一下,要学习链表,就不得不讲一下前面的线性表
线性表的定义:
线性表是具有相同数据结构n(n>=0)个数据元素的有限序列。其中n为表长,当n=0时,该线性表是一个空表。
线性表可以分为线性存储-》顺序表 和 链式存储-》(单链表、双链表、循环链表)指针实现、(静态链表)数组实现
线性表的顺序存储又称为顺序表,它是用一组地址连续的存储单元,依次存储线性表中的数据元素,从而是得逻辑上相邻的两个元素在物理位置上也相邻。
sizeof(ElemType)是每个数据元素所占用存储空间的大小
注意:线性表中的元素的位是从1开始的,而数组中元素的下标是从0开始的
#define MaxSize 50 typedef struct { ElemType data[MaxSize]; int length; }SqList;
一维数组可以是静态分配的,也可以是动态分配的,在静态分配时,由于数组的大小和空间事先已经固定,一旦空间占满,再加入新的数据将产生溢出,就会导致程序崩溃。而动态分配时,存储数组的空间实在程序执行过程中通过动态存储分配语句分配的,一旦数据空间占满,可以另外开辟一块更大的存储空间,用以替换原来的存储看空间,从而达到扩充存储数组空间的目的,而不需要一次性地划分所有所需空间给线性表。
#define InitSize 100 typedef struct { ElemType *data; int MaxSize,length; } SeqList;
c语言的初始动态分配语句为
L.data=(ElemType*)malloc(sizeof(ElemType)*InitSize);
顺序表最主要的特点是随机访问,即通过首地址和元素序号可以在O(1)的时间内找到指定元素
顺序表上的基本操作的实现
插入操作
bool ListInsert (SqList &L, int i , ElemType e) { // 本算法实现将元素e插入到顺序表L中第i个位置 if (i<1 || i>L.length+1) return false; if (L.length>=MaxSize) return false; for(int j=L.length; j>i;j--) L.data[j]=L.data[j-1]; L.data[i-1]=e; L.length++; return true; }
删除操作
bool ListDelete(SqList &L ,int i , int &e) { //本算法实现删除顺序表L中第i个位置的元素 if(i<1 || i>L.length) return false; e=L.data[i-1]; for(int j=i; j<L.length; j++) L.data[j-1]=L.data[j]; L.length--; return true; }
按值查找
int LocateElem(SqList L, ElemType e) { //本算法实现查找顺序表中值为e的元素,吐过查找成功,返回元素位序 int i; for(i=0;i<L.length;i++) if(L.data[i]==e) return i+1; return 0; }