顺序表示一种最为简单的线性结构,可以分为两种,一种是静态顺序表,一种是动态顺序表
1)静态顺序表
所谓静态顺序表是指一旦定义了该表,其大小始终固定不变,函数调用时,静态顺序表在函数栈上开辟空间,我们熟悉的数组就是一种静态顺序表
e.g
#definde MAXSIZE 100
ElemType Sqlist[MAXSIZE];
int len;
2)动态顺序表
所谓动态顺序表是一种更为灵活的顺序表,它创建在内存的动态存储区,也就是创建在堆内存,因此其长度是可以变化的
e.g
#define MAXSIZE 10
#define INCREMENTSIZE 10
typedef struct{
ElemType *elem;
int length;
int listsize;
int incrementsize;
}Sqlist;
- 向顺序表中插入第i个位置插入元素
//向顺序表第i个位置插入元素
int InsertElem(Sqlist *L,int i, int item){
//向顺序表L第i个位置插入元素item
int *base, *intserPtr, *p;
//非法插入
if(i < 1 || i > L->length+1){
return 0;
}
if(L->length >= L->listsize){
//重新追加空间
base = (int*)realloc(L->elem,(L->incrementsize+L->listsize)*sizeof(int));
if(base == NULL) return 0;
//更新内存基地址
L->elem = base;
L->listsize += L->incrementsize;
}
//插入的位置
intserPtr = &(L->elem[i-1]);
//将i-1后的元素顺序后移一个元素的位置
for(p = &(L->elem[L->length-1]); p >= intserPtr; p--){
*(p+1) = *p;
}
*intserPtr = item;
L->length++;
return 1;
}
- 编程实现顺序表的逆置
//顺序表的逆置
void reverseSqlist(Sqlist *L){
int buf;
int low = 0;
int high = L->length-1;
while(low < high){
buf = L->elem[low];
L->elem[low] = L->elem[high];
L->elem[high] = buf;
low++;
high--;
}
}
- 编程实现删除顺序表中的重复元素
//删除顺序表的重复元素
void purge(Sqlist * L){
int i,j;
for(i = 0;i < L->length;i++){
if(L->elem[i] != FLAG){
for(j = i+1;j < L->length; j++){
if(L->elem[j] == L->elem[i]){
L->elem[j] = FLAG;
}
}
}
}
for(i = 0;L->elem[i] != FLAG; i++);
for<