线性表的定义
线性表是一种最简单的线性结构,一个线性表是n个数据元素的有序序列。
同一线性表中的元素必定具有相同特性,就是要属于同一数据对象,相邻数据元素之间存在着序偶关系(序偶:一对有序的数)
在一个线性表中,一个数据元素可以由若干个数据项组成。在这种情况下,常把数据元素称为记录,含有大量元素的线性表又叫文件。
MOOC上是:
线性表:由同类型数据元素构成有序序列的线性结构
表中元素个数称为线性表的长度
线性表没有元素时,称为空表
表起始位置称表头,表结束位置称表尾
【线性结构是一个数据元素的有序集
它的特点是:
- 存在唯一一个被称作“第一个”的数据元素
- 存在唯一一个被称作“最后一个”的数据元素
- 除第一个外,集合中的每个数据元素均只有一个前驱
- 除最后一个外,集合中每个数据元素均只有一个后继
】
线性表的顺序表示和实现
线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素。【缺点在于插入或删除元素的时候需要移动大量元素】
初始化、插入、删除、查找、合并、尾插、长度、判断空、销毁、打印、清空
//线性表的顺序存储
#include<cstdio>
#include<iostream>
#include<stdlib.h>
#define SIZE 100
typedef char Elemtype;
typedef int Status;
using namespace std;
typedef struct{
Elemtype* elem;//存放线性表地址
int length;//存放长度
int listsize;//当前分配的存储容量
}Sqlist;//结构体变量名
Status InitList(Sqlist &L)//初始化
{
L.elem=(Elemtype *)malloc(SIZE*sizeof(Elemtype));
if(!L.elem)
exit(0);
L.length=0;
L.listsize=SIZE;
return 1;
}
Status Listinsert(Sqlist &L,int i,Elemtype e)//在第i个位置之前插入新元素e
{
Elemtype *newbase,*q,*s;
if(i>L.length+1||i<1)
return 0;
if(L.length>=L.listsize){
newbase=(Elemtype*)realloc(L.elem,(L.listsize+SIZE)*sizeof(Elemtype));
if(!newbase)
exit(0);
L.elem=newbase;
L.listsize+=SIZE;
}
q=&(L.elem[i-1]);
for(s=&(L.elem[L.length-1]);s>=q;--s)
{
*(s+1)=*s;
}
*q=e;
++L.length;
return 1;
}
//删除第i个元素,并用e返回这个值
Status Listdelect(Sqlist &L,int i,Elemtype &e){
if(i<1||i>L.length)
return 0;
e=L.elem[i-1];
for(int j=i;j<L.length;j++)
L.elem[j-1]=L.elem[j];
L.length--;
return 1;
}
//按照位置取元素
void Getelem(Sqlist &L,int i,Elemtype &e){
e=L.elem[i-1];
}
//长度
Status Listlength(Sqlist &L)
{
return L.length;
}
//尾插
Status Pushback(Sqlist &L,Elemtype e){
Elemtype *newbase;
if(L.length>=L.listsize)