顺序表的概念以及源码实现

一、顺序表的基本概念
概念:用一组地址连续的存储单元依次存储线性表的数据元素,这种存储结构的线性表称为顺序表。

特点:逻辑上相邻的数据元素,物理次序也是相邻的。

只要确定好了存储线性表的起始位置,线性表中任一数据元素都可以随机存取,所以线性表的顺序存储结构是一种随机存取的储存结构,因为高级语言中的数组类型也是有随机存取的特性,所以通常我们都使用数组来描述数据结构中的顺序储存结构,用动态分配的一维数组表示线性表。

二、线性表的存储位置

每个元素需占用l个存储单元

第i+1个元素的存储位置LOC(ai+1)与第i个元素的存储位置LOC(ai)的关系:

LOC(ai+1)=  LOC(ai)+ l

第i个元素的存储位置LOC(ai)与第1个元素的存储位置LOC(a1)的关系:

LOC(ai+1)=  LOC(ai)+ (i-1)* l

三、顺序表的实现

#include<stdio.h>
#include<stdlib.h>

#define maxlen 100	//数据最大长度 maxlen
#define ok 1	//操作成功标识 ok
#define no -1	//操作失败标识 no
typedef int Elemtype;	//Elemtype是数据的类型
typedef int cz;	//cz为执行操作时函数的类型
typedef struct{	//定义顺序表的结构sqlist
	int len;	//len是表的长度
	Elemtype *elem;	//elem为表中所存的数据
}Sqlist;
cz Initlist(Sqlist *L)	//初始化顺序表
{
	L->elem=(Elemtype*)malloc(sizeof(Elemtype)*maxlen);	//动态分配表的内存
	if(!L->elem){	//判断是否给顺序表L分配了内存单元
		return no;
	}
	L->len=0;
	return ok;
}
cz Listinsert(Sqlist *L,int i,Elemtype e)	//插入 在第i位插入e元素
{
	if(i>L->len+1||i<1){	//判断i是否符合条件
		return no;
	}
	if(i<=L->len)	//判断是否是在表尾插入
	{
		for(int j=L->len-1;j>=i-1;j--){
			L->elem[j+1]=L->elem[j];	//i后面的值后移
		}
	}
	L->elem[i-1]=e;	//把e值传给i位元素
	L->len++;	长度加1
	return ok;
}
cz Listdel(Sqlist *L, int i)	//删除第i位元素
{
    if(L->len==0||i<1||i>L->len){	//判断i是否符合条件且L长度不为1
        return no;
    }
    for(int j=i-1;j<L->len;j++){
        L->elem[j] = L->elem[j+1];	//i后面的值左移
    }
    L->len--;    //长度减1
    return ok;
}
cz Getelem(Sqlist L, int i, Elemtype *e)	//获取第i位元素的值并把其传给e
{
    if(i<1||i>L.len){	//判断i是否符合条件且L长度不为1
        return no;
    }
    *e = L.elem[i-1];	//给值
    return ok;
}
void Output(Sqlist L)	//遍历输出
{
    printf("当前顺序表的长度:%d\n", L.len);
    for(int i=0;i< L.len;i++){ 	//遍历整个L
        printf("%d	",L.elem[i]);
    }
    printf("\n");
}
int main()
{
	Sqlist *L;	//创建一个顺序表
	Initlist(L);	//把表初始化
	int i=1;
	int n;
	Elemtype e;
	printf("请输入数据:");
	while(1){
		scanf("%d",&n);
		if(n== -1) break;
		e=(Elemtype)n;
		Listinsert(L,i,e);
		i++;
	}         
	printf("------------------------以上数据已插入表中-------------------------\n");
	printf("\n");
	printf("---------------------------遍历表中的数据---------------------------\n");
	Output(*L);
	printf("---------------------------删除表中的数据---------------------------\n");
	printf("请输入欲删除数据的位置:");
	scanf("%d",&n);
	Listdel(L,n);
	Output(*L);
	printf("---------------------------获取表中的数据---------------------------\n");
	Elemtype x;
	printf("请输入欲获取数据的位置:");
	scanf("%d",&n);
	Getelem(*L,n,&x);
	printf("第%d位元素的值为:%d\n",n,x);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值