线性表之顺序表

线性表复习:
	1.线性表定义:线性表是由n(n>=0)个具有相同数据类型的的数据元素构成的有限序列
常记为:  	A=(a1,a2,a3,...,an)   其中:  A是线性表名,n为线性表长度   
 	2.线性表有两种存储方式:顺序存储和链式存储
     3.线性表分为:顺序表和链式表 写算法时,先写逻辑结构要使用的数据结构和基本运算,然后选定了具体的存储结构 才能写运算的具体实现代码。 4.顺序表的基本操作 SeqList 是结构体名字 DataType 是结构体中数据元素的类型      逻辑结构上:
     1.数据元素的定义

      typedef int DataType; //使int重命名为DataType
      typedef struct{
        DataType data[MAXSIZE]; //定义DataType为int ,存储结构为顺序存储
        int length;
      }SeqList;

    2.基本操作定义----这里使用的是文字描述(自然语言)
		1.创建线性表:create_List(SeqList &L)
		2.输出线性表中的元素:out_List(SeqList &L)
			注意事项:要判断线性表是否为空 
		3.求线性表的长度:length_List(SeqList &L)
		4.简单查找(根据给定元素返回x第一次出现的位置):check_List(SeqList &L,DataType x)	
		5.复杂查找(根据给定元素返回x出现的所有位置):checkAll_List(SeqList &L,DataType x)
		6.插入操作(根据给定的第i个位置插入元素x):insert_List(SeqList &L,int i,DataType x)
			注意事项:插入时,
				1.要判断插入位置是否合法和线性表是否是满了 
				2.插入完成后,要把线性表的表长+1	
		7.简单删除操作(删除线性表中第i个位置的元素):delete_List(SeqList &L,int i)
			注意事项:删除时,
				1.要判断删除位置是否合法和线性表是不是空表 
				2.建议使用while循环,从第i-1个位置向后循环,让后面元素覆盖前一个元素位置实现删除操作 ,i++ 
				3.删除完成后线性表长度要-1 
		8.复杂删除操作(从线性表L的第i个位置删除k个元素):deleteK_List(SeqList &L,int i,int k) 
			注意事项:删除时,
				1.要判断删除位置是否合法和线性表是不是空表 
				2.建议使用while循环,从第i+k-1个位置到结尾,循环体内把 i+k-1位置元素赋值给i-1位置的元素,i++ 
				3.删除完成后线性表长度要-1 

 

//因为选定的是顺序表,数据结构为线性表,存储结构为顺序存储,所以可以写存储结构的具体实现了  这里用的是c语言

//物理结构实现

#include <iostream>
#define MAXSIZE 100
using namespace std;
typedef int DataType;   //使int重命名为DataType 
typedef struct{
	DataType data[MAXSIZE];  //定义DataType为int ,存储结构为顺序存储 
	int length; 
}SeqList; 

//创建顺序表 
void create_List(SeqList &L){
	cout<<"请输入要输入的数据个数:";
	cin>>L.length;
	cout<<"请输入要输入的数据:"<<"\n";
	for(int i=0;i<L.length;i++){
		cin>>L.data[i];
	}
}

//输出顺序表中的元素
void out_List(SeqList &L){
	//判断线性表是否为空 
	if(L.length != 0){
		for(int i=0;i<L.length;i++){
			cout<<L.data[i]<<" ";
		}
	}else{
		cout<<"线性表为空"<<"\n";
	} 
}

//求线性表的长度(求线性表中数据元素的个数)
int length_List(SeqList &L){
	return L.length; 
} 

//简单查找  返回-1表示线性表为空  返回i表示x在书虚表中的位置(从0开始) 
int check_List(SeqList &L,DataType x){
	//判断线性表是否为空
	if(L.length != 0){
		for(int i=0;i<L.length;i++){
			if(L.data[i] == x){
				//cout<<"x在顺序表中的位置是:"<<i<<"\n";
				return i;
			}
		}
	}else{
		//否则线性表为空 
		return -1;
	}
} 

//复杂查找
void checkAll_List(SeqList &L,DataType x){
	//判断线性表是否为空
	if(L.length != 0){
		int count=0; //用来定义未找到的情况  count=0,未找到 
		cout<<"复杂查找元素x在线性表中的位置分别是:";
		for(int i=0;i<L.length;i++){
			if(L.data[i] == x){
				cout<<i<<" "; 
				count++;
			}
		}
		//判断未找到的情况 
		if(count == 0){
			cout<<"未找到!"<<"\n"; 
		}else{
			cout<<"\n";
		}
	}else{
		//否则线性表为空
		cout<<"线性表为空,复杂查找失败!"<<"\n";
	}
} 
 
//插入操作 在第i个位置插入元素类型为DataType的元素x 
//n个元素有n+1个位置可以插入 
int insert_List(SeqList &L,int i,DataType x){
	//判断插入位置是否合法 i取值范围i>=0 && i<=L.length+1
	if(i<0 || i>L.length+1){
		cout<<"插入位置不合法!"<<"\n"; 
		return -1; //异常退出 
	} 
	//如果线性表满了,插入不了 
	if(L.length == MAXSIZE){
		cout<<"线性表空间满了!无法插入!"<<"\n"; 
		return -1;
	} 
	//如果线性表为空 
	if(L.length == 0){
		if(i == 1){
			L.data[i-1] = x;
			L.length++; 
		}else{
			cout<<"插入失败!\n"; 
			return -1;
		}
		return 0;
	} 
	//正常情况 先移动位置,在插入 
	for(int j=L.length-1;j>=i-1;j--){
		L.data[j+1]=L.data[j];
	}
	L.data[i-1] = x;
	L.length++;
	cout<<"插入成功!"<<"\n"; 
	return 0; 
} 

//简单删除操作  删除i位置的元素 
int delete_List(SeqList &L,int i){
	//飞控表时判断删除位置是否合法  
	//非空表时:i>=0 && i<L.length 
	//空表时: i>0 && i<L.length
	if(i<0 || i>L.length){
		cout<<"删除位置不合法!\n";
		return -1;
	} 
	//判断是不是空表
	if(L.length == 0){
		cout<<"空表,无法进行删除操作!";
		return -1; 
	}else{
		while(i<L.length){
			L.data[i-1] = L.data[i];
			i++;
			L.length--;
			cout<<"删除成功!\n";
			return 0;
		}
	}
} 

//复杂删除操作  从i位置删除k个数据元素 
//n个元素可以有n个位置可以删除 
int deleteK_List(SeqList &L,int i,int k){
	//飞控表时判断删除位置是否合法  
	//非空表时:i>=0 && i<L.length 
	//空表时: i>0 && i<L.length
	if(i<0 || i>L.length){
		cout<<"删除位置不合法!\n";
		return -1;
	} 
	//判断是不是空表
	if(L.length == 0){
		cout<<"空表,无法进行删除操作!";
		return -1; 
	}else{ //用笔画一下就出来了 
		for(int j=i+k;j<=L.length;j++){
			L.data[j-k-1] = L.data[j-1];
		}
		L.length=L.length-k;
		return 0;
	} 
} 

//主函数用来测试 int main(int argc, char** argv) { SeqList L; create_List(L); out_List(L); cout<<"\n"; cout<<"元素个数是:"<<length_List(L)<<"\n"; deleteK_List(L,2,2); out_List(L); cout<<"\n"; cout<<"元素个数是:"<<length_List(L)<<"\n"; return 0; }

  

上一篇:数组和arrays类


下一篇:数据结构(图)