数据结构与算法(顺序表)

目录

概要

顺序存储的特点

顺序存储结构的不足:

顺序存储实现

顺序表操作--创建

​编辑清空表

是否空

求长度

求某元素位置

任意位置插入

输出表元素

删除表

删除表上某位置元素

合并两个表数据

去重

判断是否有该元素

修改某元素的值

删除某元素


概要

线性表作为一种基本的数据结构类型, 在计算机存储器中的映象( 或表示) 一般有两种形式, 一种是顺序映象, 一种是链式映象。

顺序存储的特点
 

– (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;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值