顺序链表简单操作

文章目录

/*
*@author zhazhazhi
*qq:2055418639
*github:zhazhazhi7
*/

顺序表

什么是顺序表?

顺序表是用来储存数据的一种结构,它会获取计算机一段连续等长的存储空间来存储数据,数组便是最常见也最方便的使用方法

顺序表由于存储位置连续,有容易浪费存储空间的缺点,但是顺序表在查询存储位置的时候非常的方便,只要输入位置信息(头地址,存储的位置),就能很快地找到数据。

顺序表的基本操作

顺序表完全可以使用数组来直接构造,其定义代码如下:

#define MAXIN 20//初定义

typedef int ELemType;
typedef struct{
    ElemType *data[MAXIN];//数据存放的数组
    int len;
}SqList;

但是顺序表的缺点在于储存的浪费,所以还是建议使用动态分配的方法来建立顺序表(但是在最后要注意将分配地址释放,避免数据溢出),下面是利用动态分配的方法构造的顺序表:

#define MAXIN 20
#define ADD 20//分配地址不够用时方便添加
typedef int ElemType ;//初定义

typedef struct {
	ElemType *head;//头指针用来确定顺序表的位置
	int len;//顺序表储存数据的长度
	int size;//顺序表的长度
}SqList;//定义顺序表 

接下来就是顺序表的基本操作了,最后会附上包括验证的完整的代码,定义部分与上文相同:

初始化顺序表:

int InitList(SqList &L){
	L.head = (int *)malloc(MAXIN*sizeof(int));//给头指针分配地址
	if(!L.head){//确认地址分配成功
		cout<<"地址分配失败"<<endl;
		return 0;
	}
	L.len=0;//初始化顺序表的数据长度,因为没有放数据所以该变量为0
	L.size = MAXIN;//初始化表长度,为MAXIN
	cout<<"初始化成功"<<endl; 
	return 0;
}//初始化顺序表 

打印顺序表:

void Print(SqList L){
	cout<<"当前的顺序表为:"<<endl;
	for(int i=0;i<L.len;i++){
		cout<<L.head[i]<<" ";
	}
	cout<<endl;
}//打印 

插入数据:

int InsertList(SqList &L,int i,ElemType e){
    //确认插入的位置是否有误
	if(i<0||i>L.size){
		cout<<"插入位置错误"<<endl;
		return 0;
	}
    //如果插入时存储位置不够则需要再扩增存储空间
	if(L.len==L.size){
		L.head = (int *)malloc((MAXIN+ADD)*sizeof(int));
		L.size+=ADD;
		if(!L.head){
			cout<<"地址分配失败"<<endl;
			return 0;
		}
	}
    //将该位置后的数据各向后移动一位
	for(int j = L.len-1 ;j>=i-1;j--){
		L.head[j+1] = L.head[j];
	} 
    //给插入位置赋值
	L.head[i-1] = e;
	L.len++;//顺序表数据存储长度加一位
	cout<<"插入成功"<<endl;
	return 0;
}//插入 

删除数据:

int DeleteList(SqList &L,int i){
	if(i<0||i>L.len){//判断删除位置是否有误
		cout<<"删除的位置有误"<<endl;	
		return 0;
	}
    //将改位置之后的所有数据向前移动一位
	for(int j = i-1;j<L.len;j++){
		L.head[j] = L.head[j+1];
	}
	cout<<"删除成功"<<endl;
	return 0;
}//删除 

在删除与插入操作中,我们一定记得要确认删除或插入的位置是否符合要求,避免数据溢出。

在插入操作中,插入的位置之后所有的数据都要向后移动。

for(int j = L.len-1 ;j>=i-1;j--){
		L.head[j+1] = L.head[j];
	} 

删除时也要进行移位操作,所有该位置之后的数据向前移动一位。

for(int j = i-1;j<L.len;j++){
		L.head[j] = L.head[j+1];
	}

完整代码:

#include<bits/stdc++.h>

using namespace std;

#define MAXIN 20
#define ADD 20
typedef int ElemType ;

typedef struct {
	ElemType *head;
	int len;
	int size;
}SqList;//定义顺序表 

int InitList(SqList &L){
	L.head = (int *)malloc(MAXIN*sizeof(int));
	if(!L.head){
		cout<<"地址分配失败"<<endl;
		return 0;
	}
	L.len=0;
	L.size = MAXIN;
	cout<<"初始化成功"<<endl; 
	return 0;
}//初始化顺序表 

int CreateList(SqList &L){
	int n,m;
	cout<<"请输入顺序表的长度"<<endl;
	cin>>n;
	if(n<0||n>MAXIN){
		cout<<"输入的顺序表长度有误"<<endl;
		return 0;
	}
	cout<<"请输入顺序表的数据"<<endl;
	for(int i=0;i<n;i++){
		cin>>L.head[i];
	}
	L.len += n;
	cout<<"顺序表创建成功"<<endl;
	for(int i=0;i<n;i++){
		cout<<L.head[i]<<" ";
	}
	cout<<endl;
}//创建新的顺序表 

int InsertList(SqList &L,int i,ElemType e){
	if(i<0||i>L.size){
		cout<<"插入位置错误"<<endl;
		return 0;
	}
	if(L.len==L.size){
		L.head = (int *)malloc((MAXIN+ADD)*sizeof(int));
		L.size+=ADD;
		if(!L.head){
			cout<<"地址分配失败"<<endl;
			return 0;
		}
	}
	for(int j = L.len-1 ;j>=i-1;j--){
		L.head[j+1] = L.head[j];
	} 
	L.head[i-1] = e;
	L.len++;
	cout<<"插入成功"<<endl;
	return 0;
}//插入 

int DeleteList(SqList &L,int i){
	if(i<0||i>L.len){
		cout<<"删除的位置有误"<<endl;	
		return 0;
	}
	for(int j = i-1;j<L.len;j++){
		L.head[j] = L.head[j+1];
	}
	cout<<"删除成功"<<endl;
	return 0;
}//删除 

void Print(SqList L){
	cout<<"当前的顺序表为:"<<endl;
	for(int i=0;i<L.len;i++){
		cout<<L.head[i]<<" ";
	}
	cout<<endl;
}//打印 

int main(){
	SqList L;
	InitList(L);
	CreateList(L);
	Print(L);
	int n,i;
	cout<<"请输入你要插入的数,位置"<<endl;
	cin>>n>>i;
	InsertList(L,i,n);
	Print(L);
	cout<<"请输入删除的位置"<<endl; 
	cin>>i;
	DeleteList(L,i);
	Print(L); 
	return 0;
}

谢谢阅读!

上一篇:对象和XML文件的转换


下一篇:python之模块cmath