线性表的定义与特点
定义
由 $n(n\geq 0) $个数据特性相同的元素构成的有限序列,称为线性表。
通俗的说:线性表是$n$个数据元素的有限序列,其中$n$个数据是相同数据类型的。
特点
线性表中元素的个数$n(n\gt0)$定义为线性表的长度,当$n=0$时称之为空表
对于非空
的线性表或线性结构,其特点是:
- 存在唯一的一个被称作
“第一个”
的数据元素;
- 存在唯一的一个被称作
“最后一个”
的数据元素;
- 除第一个元素外,结构中的每个数据元素均只有一个前驱:
- 除最后一个元素外,结构中的每个数据元素均只有一个后继。
线性表的顺序表示与实现-顺序表
用一组连续的内存单元依次存储线性表的各个元素,也就是说,逻辑上相邻的元素,实际的物理存储空间也是连续的。
顺序表-存储结构
1 2 3 4 5 6 7
| #define MAXSIZE100 typedef int ElemType;
typedef struct{ ElemType data[MAXSIZE]; int length; }SeqList;
|
顺序表-初始化
1 2 3 4 5 6 7 8 9 10 11
| #define MAXSIZE100 typedef int ElemType;
typedef struct{ ElemType data[MAXSIZE]; int length; }SeqList;
void initList(SeqList *L){ L->length = 0; }
|
顺序表-在尾部添加元素
1 2 3 4 5 6 7 8 9
| int appendElem(SeqList *L,ElemType e){ if(L->length>=MAXSIXZE){ printf("顺序表已满\n"); return 0; } L->data[L->length]=e; L->length++; return 1; }
|
顺序表-遍历
1 2 3 4 5 6
| void listElem(SqeList *L){ for(int i=0;i<L->length;i++){ printf("%d ",L->data[i]); } printf("\n"); }
|
顺序表-插入元素
1 2 3 4 5 6 7 8 9 10
| int insertElem(SeqList *L,int pos,ElemType e){ if(pos<=L->length){ for(int i=L->length-1;i>=pos-1;i--){ L->data[i+1]=L->data[i]; } L=data[pos-1]=e; L->length++; } return 1; }
|
顺序表插入数据的最好时间复杂度是O(1):在倒数第二个位置插入元素
顺序表插入数据的最坏时间复杂度是O(n):在第一个位置插入元素
顺序表-删除元素
1 2 3 4 5 6 7 8 9 10
| int deleteElem(SeqList *L, int pos,ElemType *e){ *e = L->data[pos-1]; if(pos<L->length){ for(int i=pos;i<L->length;i++){ L->data[i-1]=L->data[i]; } } L->length--; return 1; }
|
顺序表-查找
1 2 3 4 5 6 7 8
| int findElem(SeqList *L,ElemType e){ for(int i=0;i<L->length;i++){ if(L->data[i]==e){ return i+1; } } return 0; }
|
顺序表-动态分配内存地址初始化
1 2 3 4 5 6 7 8 9 10 11
| typedef struct{ ElemType *data; int length; }SeqList;
SeqList* initList(SeqList *L){ SeqList *L=(SeqList*)malloc(sizeof(SeqList)); L->data=(ElemType*)malloc(sizeof(ElemType) * MAXSIZE); L->length =0; return L; }
|
线性表的链式表示与实现-链表
线性表的应用