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;
}
//这个函数最后在主函数中调用一下就行了