春节学习之从入门到放弃学习 ~~~废材大学几年没学,从头开始系列02

今天还算起的还早,八点差不多就爬了起来了,昨天十点就要睡的,玩了一会手机,又到了十一点啦,只要把手机放到枕头旁边肯定会玩的很晚。。。

昨天学完栈,做了做后面的习题,发现前面学的链表几乎全部忘记了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;
}

猜你喜欢

转载自www.cnblogs.com/yitian09/p/10357904.html