数据结构(/顺序表)—001

数据结构(/顺序表)—001_第1张图片

数据结构之顺序表

内容:

1—线性表的物理存储结构和线性表的逻辑存储结构

2—线性表的定义

3—线性表L的遍历

4—线性表L的初始化操作

5—线性表L添加元素

6—线性表L的元素插入

7—删除线性表L中第i个位置的元素,并用e返回其值

8—销毁线性表L

 

一:线性表的物理存储结构和逻辑结构

在这之前,我先给大家解释一下什么是物理存储结构和逻辑结构!

逻辑结构:是指数据对象中数据元素之间的相互关系。
    1:集合结构
        集合结构:集合结构中数据元素除了同属一个集合外,他们之间没有其他关系。
    2:线性结构
        线性结构中的元素之间的元素是一对一的关系;
    3:树形结构
        树形结构中的数据元素之间存在一种一对多的层次关系
    4:图形结构
        图形结构的数据元素是多对多的关系

物理结构:是指数据的逻辑结构在计算机中的存储形式。
    ++++数据元素的存储结构形式有两种:顺序存储和链式存储。
    ---顺序存储结构
        顺序存储结构:是把数据元素存放在地址连续的存储单元里,其数据间的逻辑关系核物理关系是一致的
    ---链式存储结构
        链式存储结构:是把数据元素存放在任意的存储单元里,这组存储单元可以是连续的,
        亦可以是不连续的。

         线性表的逻辑结构:是集合结构,即表中的的数据元素除了同属一个集合,他们之间没有

                                             其他的关系,即线性表不关注其元素的大小关系或者其他的关联。

         线性表的物理结构:是顺序存储结构,即数据元素存放在地址连续的存储单元中!

二:顺序表的定义:

      线性表是零个或多个数据元素的有限序列!

从上面这句话我们可以知道,首先线性表是一个序列。也就是说元素之间是有顺序的,假如元素存在多个

则第一个元素无前驱,最后一个元素无后继,且其它每个元素有且只有一个前驱和后继;然后线性表是

有限的,事实上,在计算机中处理的对象都是有限的,那种无限的数列,只存在与数学概念当中;

前面说了这么多,不知到现在大家对于线性表是不是已经有了一个整体的认知呢,现在开始代码环节了:

/*线性表的定义*/
/*所用的编译器为,vc2010教育版!有需要的可以加我qq:2105442847*/
#include
#include

//定义一个顺序表的结构体
typedef struct _List{
	int *elems;			//顺序表的基地址
	int size;			//顺序表的空间
	int length;			//线性表的当前长度

}Sqlist;


int main(void){
	//定义一个顺序表
	Sqlist L;

	system("pause");
	return 0;
}

解释一下上面的带码作用:[int  size;]是我们将要给线性表分配的最大空间;[int *elems;]则是用来访问线性表中的元素;[int  length;]则是用来访问元素的下标,现在各位可能还有些不明白的地方!不要着急,后面还会多次出现!

三:初始化一个空的线性表

#include
#include

#define MAX_SIZE  10

//定义一个顺序表的结构体
typedef struct _List{
	int *elems;			//顺序表的基地址
	int size;			//顺序表的空间
	int length;			//线性表的当前长度

}Sqlist;
//初始化一个空的顺序表
bool Init_Sqlist(Sqlist& L){
	L.elems=new int[MAX_SIZE];//给线性表分配100个int型的内存空间大小
	if(!L.elems) return false;	//如果分配内存失败,则返回false;
	L.size=MAX_SIZE;		//定义表的最大空间,即最大长度
	L.length=0;			//定义表的长度为0,即是一个空链表
	return true;		//代码运行到此处,说明初始化一个空线性表成功,返回true;
}

int main(void){
	//定义一个顺序表
	Sqlist L;
	//初始化一个空的顺序表
	if(Init_Sqlist(L)){
		printf("初始化成功!");
	}else{
		printf("初始化失败!");
	}

	system("pause");
	return 0;
}

四:遍历线性表元素

#include
#include

#define MAX_SIZE  10

//定义一个顺序表的结构体
typedef struct _List{
	int *elems;			//顺序表的基地址
	int size;			//顺序表的空间
	int length;			//线性表的当前长度

}Sqlist;
//初始化一个空的顺序表
bool Init_Sqlist(Sqlist& L){
	L.elems=new int[MAX_SIZE];//给线性表分配100个int型的内存空间大小
	if(!L.elems) return false;	//如果分配内存失败,则返回false;
	L.size=MAX_SIZE;		//定义表的最大空间,即最大长度
	L.length=0;				//定义表的长度为0,即是一个空链表
	return true;			//代码运行到此处,说明初始化一个空线性表成功,返回true;
}
//遍历线性表中的元素
void printf_Sqlist(Sqlist& L){
	if(L.length==0) {
		printf("这是一个空的线性表!\n");
		return ;	//如果遍历的是一个空线性表,则返回;
	}
	for(int i=0;i

五:添加元素

#include
#include

#define MAX_SIZE  10

//定义一个顺序表的结构体
typedef struct _List{
	int *elems;			//顺序表的基地址
	int size;			//顺序表的空间
	int length;			//线性表的当前长度

}Sqlist;
//初始化一个空的顺序表
bool Init_Sqlist(Sqlist& L){
	L.elems=new int[MAX_SIZE];//给线性表分配100个int型的内存空间大小
	if(!L.elems) return false;	//如果分配内存失败,则返回false;
	L.size=MAX_SIZE;		//定义表的最大空间,即最大长度
	L.length=0;				//定义表的长度为0,即是一个空链表
	return true;			//代码运行到此处,说明初始化一个空线性表成功,返回true;
}
//遍历线性表中的元素
void printf_Sqlist(Sqlist& L){
	if(L.length==0) {
		printf("这是一个空的线性表!\n");
		return ;	//如果遍历的是一个空线性表,则返回;
	}
	for(int i=0;i=L.size){
		printf("存储空间已满!");
		return false;
	}
	L.elems[L.length]=e;
	L.length++;
	return true;
}
int main(void){
	//定义一个顺序表
	Sqlist L;
	//初始化一个空的顺序表
	int n,e;
	if(Init_Sqlist(L)){
		printf("初始化成功!\n");
	}else{
		printf("初始化失败!\n");
	}
	遍历线性表中的元素
	printf_Sqlist(L);
	//添加元素
	printf("请输入要添加元素的个数n:");
	scanf("%d",&n);
	while(n){
		printf("请输入要添加元素的值e:");
		scanf("%d",&e);
		add_Sqlist(L,e);
		n--;
	}
	printf_Sqlist(L);
	system("pause");
	return 0;
}

六:在指定位置插入元素

#include
#include

#define MAX_SIZE  10

//定义一个顺序表的结构体
typedef struct _List{
	int *elems;			//顺序表的基地址
	int size;			//顺序表的空间
	int length;			//线性表的当前长度

}Sqlist;
//初始化一个空的顺序表
bool Init_Sqlist(Sqlist& L){
	L.elems=new int[MAX_SIZE];//给线性表分配100个int型的内存空间大小
	if(!L.elems) return false;	//如果分配内存失败,则返回false;
	L.size=MAX_SIZE;		//定义表的最大空间,即最大长度
	L.length=0;				//定义表的长度为0,即是一个空链表
	return true;			//代码运行到此处,说明初始化一个空线性表成功,返回true;
}
//遍历线性表中的元素
void printf_Sqlist(Sqlist& L){
	if(L.length==0) {
		printf("这是一个空的线性表!\n");
		return ;	//如果遍历的是一个空线性表,则返回;
	}
	for(int i=0;i=L.size){
		printf("存储空间已满!");
		return false;
	}
	L.elems[L.length]=e;
	L.length++;
	return true;
}
//在指定位置插入元素

bool Insert_Sqlist(Sqlist& L,int x,int e1){
	if(x>L.size||x>L.length)return false;	//如果插入的位置不合法,则返回false
	if(x==L.length){				//如果插入的位置在最后,则调用add_Sqlist(L,e1);函数
		add_Sqlist(L,e1);
		return true;
	}
	///
	for(int i=L.length;i>=x-1;i--){			//移动元素,从最后一个元素开始移动	
		L.elems[i+1]=L.elems[i];
	}
	L.elems[x-1]=e1;
	L.length++;
	return true;
	/*以下为错误代码大家可以参考一下
	if(x<0||x>=L.length) return false;		
	if(MAX_SIZE==L.length)return false;		
	for(int i=L.length-1;i>=x;i--){	
	L.elems[i+1]=L.elems[i];
	}
	L.elems[x]=e1;
	L.length++;
	return true;//插入成功,返回true;*/
}
int main(void){
	//定义一个顺序表
	Sqlist L;
	//初始化一个空的顺序表
	int n,e,x,e1;
	if(Init_Sqlist(L)){
		printf("初始化成功!\n");
	}else{
		printf("初始化失败!\n");
	}
	遍历线性表中的元素
	printf_Sqlist(L);
	//添加元素
	printf("请输入要添加元素的个数n:");
	scanf("%d",&n);
	while(n){
		printf("请输入要添加元素的值e:");
		scanf("%d",&e);
		if(add_Sqlist(L,e)){
			printf("添加元素成功!");
		}else{
			printf("添加元素失败!");
		}
		n--;
	}
	printf_Sqlist(L);

	//在指定位置插入元素
	printf("请输入要插入元素的位置x:");
	scanf("%d",&x);
	printf("请输入要插入元素值e1:");
	scanf("%d",&e1);
	if(Insert_Sqlist(L,x,e1)){
        printf("插入成功!");
        }else{
               printf("插入失败!");  
        }
	printf_Sqlist(L);

	system("pause");
	return 0;
}

七:删除指定位置的元素

#include
#include

#define MAX_SIZE  10

//定义一个顺序表的结构体
typedef struct _List{
	int *elems;			//顺序表的基地址
	int size;			//顺序表的空间
	int length;			//线性表的当前长度

}Sqlist;
//初始化一个空的顺序表
bool Init_Sqlist(Sqlist& L){
	L.elems=new int[MAX_SIZE];//给线性表分配100个int型的内存空间大小
	if(!L.elems) return false;	//如果分配内存失败,则返回false;
	L.size=MAX_SIZE;		//定义表的最大空间,即最大长度
	L.length=0;				//定义表的长度为0,即是一个空链表
	return true;			//代码运行到此处,说明初始化一个空线性表成功,返回true;
}
//遍历线性表中的元素
void printf_Sqlist(Sqlist& L){
	if(L.length==0) {
		printf("这是一个空的线性表!\n");
		return ;	//如果遍历的是一个空线性表,则返回;
	}
	for(int i=0;i=L.size){
		printf("存储空间已满!");
		return false;
	}
	L.elems[L.length]=e;
	L.length++;
	return true;
}
//在指定位置插入元素

bool Insert_Sqlist(Sqlist& L,int x,int e1){
	if(x>L.size||x>L.length)return false;	//如果插入的位置不合法,则返回false
	if(x==L.length){				//如果插入的位置在最后,则调用add_Sqlist(L,e1);函数
		add_Sqlist(L,e1);
		return true;
	}
	///
	for(int i=L.length;i>=x-1;i--){			//移动元素,从最后一个元素开始移动	
		L.elems[i+1]=L.elems[i];
	}
	L.elems[x-1]=e1;
	L.length++;
	return true;
	
}
删除指定位置的元素,并返回其值
bool Delte__Sqlist(Sqlist& L,int y){

	if(y>L.size||y>L.length)return false;	//如果删除的位置不合法,则返回false	
	for(int i=y;y<=L.length;y++){
		
		L.elems[y-1]=L.elems[y];
	}
	L.length--;
	return true;
}
int main(void){
	//定义一个顺序表
	Sqlist L;
	//初始化一个空的顺序表
	int n,e,x,e1,y;
	if(Init_Sqlist(L)){
		printf("初始化成功!\n");
	}else{
		printf("初始化失败!\n");
	}
	遍历线性表中的元素
	printf_Sqlist(L);
	//添加元素
	printf("请输入要添加元素的个数n:");
	scanf("%d",&n);
	while(n){
		printf("请输入要添加元素的值e:");
		scanf("%d",&e);
		if(add_Sqlist(L,e)){
			printf("添加元素成功!");
		}else{
			printf("添加元素失败!");
		}
		n--;
	}
	printf_Sqlist(L);

	//在指定位置插入元素
	printf("请输入要插入元素的位置x:");
	scanf("%d",&x);
	printf("请输入要插入元素值e1:");
	scanf("%d",&e1);
	Insert_Sqlist(L,x,e1);
	printf_Sqlist(L);
	//删除指定位置的元素,并返回其值
	printf("请输入要删除元素的位置y:");
	scanf("%d",&y);
	int m=L.elems[y-1];	//保存将要删除的值
	if(Delte__Sqlist(L,y)){
		printf("删除成功!");
		printf("删除元素的值为m:%d\n",m);
	}else{
		printf("删除失败!");
	}
	printf_Sqlist(L);
	

	system("pause");
	return 0;
}

八:销毁线性表

void destory(Sqlist& L){
	delete L.elems;
	L.length=0;
}
//这个函数最后在主函数中调用一下就行了

 

你可能感兴趣的:(数据结构,数据库,c++,c语言,线性代数)