线性表-顺序表
线性表定义
线性表是用一组地址连续的存储单元来依次存储线性表的数据元素,从而使得逻辑上相邻的两个元素在 物理位置上也相邻。
线性表的特点
1存储密度高----他的空间全部 用来存放数据
2随机访问----它可以直接访问到某个元素,查找某个元素的时间复杂度为O(1)
3逻辑相邻的两个元素在物理结构上也相邻—那么插入和删除某个元素时就要移动这个元素后面所有的元素
线性表的操作
创建一个线性表(有两种方法静态分配和动态分配)
静态分配
#define MAX_SIZE 50
typedef struct{
Elemtype data[MAX_SIZE];
int length;
}Seqlist;
动态分配
#define InitSize 50
typedef struct{
Elemtype *data;
int length;
int MAX_SIZE;
}Seqlist;
Seqlist L;
L.date = (Elemtype*)malloc(sizeof(Elemtype)*IntiSize);
静态分配和动态分配的区别是,静态分配空间有限,当数据存满时,再存数据会出错;而使用动态分配,当 存储 空间占满时,会另外开辟出一块更大的空间来代替原来的空间。
插入元素
在第i个位置插入元素,意味着下标为i-1~L.length-1的数据都要后移
bool ListInsert(Seqlist &L,int i,Elemtype e)
{
if(i>L.length+1||i<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;
}
删除元素
删除第i个元素,意味着下标为i~L.length-1的元素都要前移
bool ListDelete(Seqlist L,int i,Elemtype &e)
{
if(i<1||i>L.length){
return false;
}
e = L.data[i-1];
for(int j = i-1;j <= L.length-1;j ++ ){
L.data[j] = L.data[j+1];
}
L.length--;
return true;
}
《王道》p22 T6.从有序表中删除其所有重复的元素
bool del(Sqlist &L)
{
if(L.length==0)
return false;
int i;//i表示删完之后的线性表索引
int j;//j表示当前线性表的索引
for(i = 0,j = 1;j < L.length;j++){
if(L.data[i] != L.data[j]){
L.data[++i] = L.data[j];
}
}
L.length = i + 1;
return true;
}
《王道》p23 T7.将两个有序表和为一个新的有序表,并由函数返回新的有序表
bool merge(Sqlist &L1,Sqlist &L2,Sqlist &L3)
{
if(L1.length+L2.length>maxSize)
return false;
int i=0,j=0,k=0;
while(i<L1.length&&j<L2.length){
if(L1.data[i]<=L2.data[j]){
L3.data[k++] = L1.data[i++];
}
else{
L3.data[k++] = L2.data[j++];
}
}
while(i<L1.length){
L3.data[k++] = L1.data[i++];
}
while(j<L2.length){
L3.data[k++] = L2.data[j++];
}
L3.length = k;
return true;
}
一个数组中存了两个线性表,按顺序存的,将数组中两个线性表位置互换,其中线性表中元素的相对位置不变
Data[m+n]
前m个存了Sqlist a
后n个存了Sqlist b
void Reverse(ElemType Data[],int left,int right,int size)
{
if(left>=right&&right>-size)
return;
int i = (left+right)/2;
while(left<=i){
ElemType temp = Data[left];
Data[left++] = Data[right];
Data[right--] = temp;
}
}
void Exchange(ElemType Data[],int m,int n,int size)
{
Reverse(Data,0,m+n-1,size);
Reverse(Data,0,n-1,size);
Reverse(Data,n,m+n-1,size);
}