目录
概要
线性表作为一种基本的数据结构类型, 在计算机存储器中的映象( 或表示) 一般有两种形式, 一种是顺序映象, 一种是链式映象。
顺序存储的特点
– (1)逻辑上相邻的元素 ai, ai+1, 其存储位置也是相邻的;
– (2)对数据元素ai的存取为随机存取或按地址存取。
– (3)存储密度高。 存储密度D=(数据结构中元素所占存储空间)/( 整个数据结构所占空间) 。
顺序存储结构的不足:
– 对表的插入和删除等运算的时间复杂度较差。
– 占用了一段连续的内存空间。
顺序存储实现
在C语言中, 一维数组的元素也是存放于一片连续的存储空间中, 故可借助于C语言中一 维 数 组 类 型 来 描 述 线 性 表 的 顺 序 存 储 结 构
#define N 100 //线性表的最大长度
typedef int data_t;
typedef struct sqlist_t
{
data_t data[N]; //表的存储空间
int last; //当前表尾指针
} sqlist_t, *sqlink; // 顺序表类型
sqlink list_create();//创建
int list_clear(sqlink L);//清空
int list_empty(sqlink L);//判断空
int list_lenth(sqlink L);//求长度
int list_local(sqlink L,data_t value);//求数据定位
int list_insert(sqlink L,data_t value,int pos);//插入数据
int list_show(sqlink L);//打印所有数据
int list_free(sqlink L);//表释放内存
int list_delete(sqlink L,int pos);//删除某元素
int list_merge(sqlink L1,sqlink L2);//两个表交集
int list_purge(sqlink L1);//去重
int list_get(sqlink L,int value);//求某位置元素
int list_change(sqlink L,int pos,data_t value);//改变某位置的值
int list_delete_value(sqlink L,data_t value);
顺序表操作--创建
sqlink list_create(){
//申请内存空间
sqlink L;
L = (sqlink)malloc(sizeof(sqlist));//申请内存的大小是sqllist,用sqlink指针来存储
//判断申请是否成功
if(NULL == L){
printf("sqlist is NULL\n");
return NULL;
}
//初始化,(初始化对象,要赋的值,要赋多少个)
memset(L,0,sizeof(sqlist));
//last赋值,不能赋值0到N-1的值,会和data冲突
//last最后一个数值的下标,a[0]-a[n-1]
L -> last = -1;
return L;
}
清空表
int list_clear(sqlink L){
if ( NULL == L){
return -1;
}
memset(L,0,sizeof(sqlist));
L->last = -1;
return 0;
}
是否空
int list_empty(sqlink L){
if (L ->last == -1){
return 0;
}
else
return 1;
}
求长度
int list_lenth(sqlink L){
if (NULL == L)
return -1;
return (L->last+1);
}
求某元素位置
int list_local(sqlink L,data_t value){
int i=0;
while(i<=L->last){
if(L->data[i] == value){
return i;
}
i++;
}
return -1;
}
任意位置插入
int list_insert(sqlink L,data_t value,int pos){
int i=0;
//判断是否满了
if (L->last ==N-1){
printf("sqlist is full!\n");
return -1;
}
//判断pos是否<0||>last+1
if (pos<0 ||pos>L->last+1){
printf("pos is invaild!\n");
return -1;
}
//move
for(i=L->last;i>=pos;i--){
L->data[i+1]=L->data[i];
}
//insert value
L->data[pos]=value;
L->last++;
return 0;
}
输出表元素
int list_show(sqlink L){
int i;
if(L==NULL){
printf("list is NULL");
return -1;
}
for(i=0;i<L->last+1;i++){
printf("%d ",L->data[i]);
}
printf("\n");
return 0;
}
删除表
int list_free(sqlink L){
if(L==NULL){
printf("list is NULL");
return -1;
}
free(L);
L=NULL;
return 0;
}
删除表上某位置元素
int list_delete(sqlink L,int pos){
//判断是否空
int i;
if(L== NULL){
printf("list is NULL\n");
return -1;
}
//判断pos是否合法
if(pos<0||pos>L->last){
printf("pos is invail!\n");
return -1;
}
//从pos+1到last的值开始往前移动
for(i=pos;i<L->last;i++){
L->data[i]=L->data[i+1];
}
//last减少一个
L->last--;
}
合并两个表数据
int list_merge(sqlink L1,sqlink L2){
int i=0,re;
while(i<=L2->last){
re = list_local(L1,L2->data[i]);
if (re == -1){
if(list_insert(L1,L2->data[i],L1->last+1)==-1){
printf("%d\n",L1->last);
printf("list L1 is full\n");
return -1;
}
}
i++;
}
return 0;
}
去重
int list_purge(sqlink L){
int i,j;
i=1;
while(i<=L->last){
j=i-1;
while(j>=0){
if(L->data[i]==L->data[j]){
list_delete(L,i);
break;
}else{
j--;
}
}
if(j<0){
i++;
}
}
return 0;
}
判断是否有该元素
int list_get(sqlink L,int value){
if(L== NULL){
printf("list is NULL\n");
return -1;
}
if(L->last == -1){
printf("list is empty\n");
return -1;
}
int i=0;
while(i<=L->last){
if(L->data[i]==value){
printf("%d\n",i);
return i;
}
i++;
}
return -1;
}
修改某元素的值
int list_change(sqlink L,int pos,data_t value){
if(L== NULL){
printf("list is NULL\n");
return -1;
}
if(L->last == -1){
printf("list is empty\n");
return -1;
}
int i=0;
L->data[i] = value;
return 0;
}
删除某元素
int list_delete_value(sqlink L,data_t value){
if(L== NULL){
printf("list is NULL\n");
return -1;
}
if(L->last == -1){
printf("list is empty\n");
return -1;
}
int pos;
pos = list_get(L,value);
list_delete(L,pos);
return 0;
}