线性表

线性表

1.线性表的定义和特点

1.定义:由n(n>=0)个数据特性相同的元素构成的有限序列称为线性表。

线性表中元素的个数n定义为线性表的长度,n=0为空表。

2.特点:

存在唯一的一个被称作“第一个”的数据元素

存在唯一的一个被称作“最后一个”的数据元素

只有一个前驱

只有一个后继

2.线性表的顺序表示和实现

1.顺序存储表示

1.顺序表:

定义:线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素,这种表示也称作线性表的顺序存储结构或顺序影像,通常称这种结构为顺序表

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

存储地址内存状态数据元素在线性表中的位序
ba11
b+la22
b+(i-1)laii
b+(n-1)lann
b+(maxlen-1)l

只要确定了存储线性表的起始位置,线性表中任一数据元素都可随机存取。

#include<iostream>
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -1

#define MAXSIZE 100	//最大长度
typedef struct
{
    ElemType *elem;	//基地址
    int length;		//当前长度
}SqList;	//结构类型
//数据元素a1,a2....an依次存放在数组elem[0],elem[1]....elem[length-1]中

//	ElemType代表所有可能的数据类型,简单明了概括了整体。除特别说明外,规定ElemType的默认是int型
//	typedef作用是为一种数据结构类型定义一个新名字

2.顺序表中基本操作的实现

1.初始化

即构造一个空表

Status InitList(SqList &L){ //构造一个空的顺序表L
	L.elem=new ElemType[MAXSIZE]; //为顺序表分配一个大小为MAXSIZE的数组空间
	if(L.elem)
		exit(OVERFLOW);	//	存储分配失败退出
	L.length=0;		//空表长度为0
	return OK;
}

2.取值

顺序表的取值是根据下标序数来进行取值。

Status GetElem(SqList L,int i,ElemType &e){
    if(i<1||i>L.length)	//判断i值是否合理
        return ERROR;
    e=L.elem[i-1];	//取值
    return OK;
}
//算法的时间复杂度O(1)

3.查找

查找操作是根据指定的元素值e,查找第一个与e相等的元素。

int LocateElem(SqList L,ElemType e){
    for(int i=0;i<L.length;i++){
        if(L.elem[i]==e)
            return i+1;
    }
    return OK;
}
//算法的时间复杂度O(n)

4.插入

在第i个位置插入一个元素时,需从最后一个元素即第n个元素开始,依次向后移动一个位置,直至第i个元素。

步骤:

1.判断插入位置是否合法(1<=i<=n+1)
2.判断线性表是否已满
3.移位
4.放入元素
5.表长加1
Status ListInsert(SqList &L,int i,ElemType e){
    if(i<1||i>L.length+1)
        return ERROR;	//第一步
    if(L.length==MAXSIZE)
        return ERROR;	//第二步
    for(int j=L.length-1;j>=i-1;j--){
        L.elem[j+1]=L.elem[j];
    }	//第三步
    L.elem[i-1]=e;	//第四步
    L.length++;		//第五步
    return OK;
    
}
//算法的时间复杂度O(n)

5.删除

删除第i个元素时需将第i+1个至第n个元素依次向前移动一个位置。

1.判断删除的位置是否合法(1<=i<=n)
2.移位
3.表长减1
Status ListDelete(SqList &L,int i){
    if(i<1||i>L.length)
        return ERROR;	//第一步
    for(int j=i;j<L.length;j++)
        L.elem[j-1]=L.elem[j];	//第二步
    L.length--;	//第三步
    return OK;
}
//算法的时间复杂度O(n)

代码实现

#include<iostream>
#include<stdlib.h>
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define MAXSIZE 100
typedef int ElemType;
typedef int Status;
typedef struct{
	ElemType *elem;
	int length;
}SqList;
Status InitList(SqList &L){ //构造一个空的顺序表L
	L.elem=new ElemType[MAXSIZE]; //为顺序表分配一个大小为MAXSIZE的数组空间
	if(!L.elem)
		exit(OVERFLOW);	//	存储分配失败退出
	L.length=0;		//空表长度为0
	return OK;
}//构造空表
Status GetElem(SqList L,int i,ElemType &e){
    if(i<1||i>L.length)	//判断i值是否合理
        return ERROR;
    e=L.elem[i-1];	//取值
    return OK;
}//取值
int LocateElem(SqList L,ElemType e){
    for(int i=0;i<L.length;i++){
        if(L.elem[i]==e)
            return i+1;
    }
    return OK;
}//查找
Status ListInsert(SqList &L,int i,ElemType e){
    if(i<1||i>L.length+1)
        return ERROR;	//第一步
    if(L.length==MAXSIZE)
        return ERROR;	//第二步
    for(int j=L.length-1;j>=i-1;j--){
        L.elem[j+1]=L.elem[j];
    }	//第三步
    L.elem[i-1]=e;	//第四步
    L.length++;		//第五步
    return OK;
    
}//插入
Status ListDelete(SqList &L,int i){
    if(i<1||i>L.length)
        return ERROR;	//第一步
    for(int j=i;j<L.length;j++)
        L.elem[j-1]=L.elem[j];	//第二步
    L.length--;	//第三步
    return OK;
}
int main(){
	int a,b,i;
	int e;
	SqList L;
	InitList(L);
	cin>>a;
	cout<<endl;
	cout<<"请输入"<<a<<"个数(用空格隔开)"<<endl;
	for(int i=0;i<a;i++){
		cin>>L.elem[i];
		L.length++;
	}
	cout<<endl;
	cout<<"请输入要取值下标:"<<endl;
	cin>>b;
	GetElem(L,b,e);
	cout<<"取值的数为"<<e<<endl;
	cout<<"请输入要查找的数:"<<endl;
	cin>>e;
	cout<<"查找的数在:"<<LocateElem(L,e)<<endl;
	cout<<"请输入要插入的位置:"<<endl;
	cin>>i;
	cout<<"请输入要插入的数:"<<endl;
	cin>>e;
	ListInsert(L,i,e);
	for(i=0;i<L.length;i++)
		cout<<L.elem[i];
	cout<<endl;
	cout<<"请输入要删除的数下标:"<<endl;
	cin>>i;
	ListDelete(L,i);
	for(i=0;i<L.length;i++)
		cout<<L.elem[i];
	cout<<endl;
	system("pause");
	return 0;
}

结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值