数据结构与算法-顺序表

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

typedef int Status;
typedef int ElemType;

#define MAXSIZE 100
typedef struct {
	ElemType elem[MAXSIZE];
	int length;
}SqList;

Status InitList(SqList* L) {
	L->length = 0;
	return OK;
}

Status GetElem(SqList* L, int i, ElemType& e) {
	if (i<1 || i>L->length)
		return ERROR;
	else
		e = L->elem[i];
	return OK;
}

Status LocateElem(SqList* L, ElemType target, int& position) {
	for (int i = 1; i <= L->length; i++) {
		if (L->elem[i] == target) {
			position = i;
			return OK;
		}
	}
	return ERROR;
}

Status InsertElem(SqList* L, int i, ElemType e) {
	if (i<1 || i>L->length + 1 || L->length == MAXSIZE)
		return ERROR;
	for (int j = L->length; j >= i; j--)
		L->elem[j + 1] = L->elem[j];
	L->elem[i] = e;
	L->length++;
	return OK;
 }

Status DeleteElem(SqList* L,int i,ElemType& e){
	if(i<1||i>L->length)
		return ERROR;
	e=L->elem[i];
	for(int j=i;j<L->length;j++)
		L->elem[j]=L->elem[j+1];
	L->length--;
	return OK;
}

int main() {
	SqList L;
	InitList(&L);
	cout << "请输入要创建的线性表的数据元素(5个数):" << endl;
	for (int i = 1; i <= 5; i++) {
		cin >> L.elem[i];
		L.length++;
	}
	cout << "线性表中的数据元素为:" << " " ;
	for (int j = 1; j <= 5; j++)
		cout << L.elem[j] << " ";
	cout << endl;

	int position;
	cout << "请输入要取值的位置:";
	cin >> position;
	ElemType value;
	Status result = GetElem(&L, position, value);
	if (result == OK)
		cout << "位置" << position << "的元素值为:" << value << endl;
	else
		cout << "取值失败,位置不合法" << endl;
	

	ElemType target;
	cout << "请输入要查找的值:";
	cin >> target;
	result = LocateElem(&L, target, position);
	if (result == OK)
		cout << "元素值" << target << "在位置" << position << "上找到了" << endl;
	else
		cout << "线性表中不存在该值";

	int InsertPosition;
	ElemType InsertValue;
	cout << "请输入要插入的元素的位置和值:";
	cin >> InsertPosition >> InsertValue;
	result = InsertElem(&L, InsertPosition, InsertValue);
	if (result == OK) {
		cout << "成功插入元素,线性表现在为:";
			for (int k = 1; k <= L.length; k++)
				cout << L.elem[k] << " ";
			cout<<endl; 
	}
	else
		cout << "插入失败" << endl;

	int deletePosition;
	cout<<"请输入要删除的元素位置:";
	cin>>deletePosition;
	ElemType deleteValue;
	result=DeleteElem(&L,deletePosition,deleteValue);
	if(result==OK){
		cout<<"删除操作成功,删除的元素值为:"<<deleteValue<<endl<<"删除后的线性表为:";
		for(int m=1;m<=L.length;m++){
			cout<<L.elem[m]<<" ";
		}
		cout<<endl;
	}
	else
		cout<<"删除位置不合法"<<endl;

}

下面是带有注释解释版本,解释每行话的作用

#include <iostream>   //引入C++的标准输入输出库
using namespace std;   //将标准库的命名空间std中的所有标识符引入当前的作用域中
#define OK 1        //宏定义,使用OK来表示操作成功
#define ERROR 0       //宏定义,使用ERROR表示操作失败
#define OVERFLOW -2   //宏定义,用OVERFLOW表示溢出

typedef int Status;   //将int重命名为Status,用于表示函数返回状态
typedef int ElemType;  //将int重命名为ElemType,定义顺序表中的元素

#define MAXSIZE 100  //宏定义,表示数组最大长度
typedef struct {
	ElemType elem[MAXSIZE];  //定义一个数组用于存储线性表中的元素
	int length;     //length表示线性表的长度
}SqList;   //将顺序表类型定义为这个名字 

Status InitList(SqList* L) { //初始化的函数
	L->length = 0;       //将当前线性表长度置为0 
	return OK;
}

Status GetElem(SqList* L, int i, ElemType& e) {      //取值的函数
	if (i<1 || i>L->length)  //判断取值位置是否合法(为0之前或者超出顺序表长度) 
		return ERROR;
	else
		e = L->elem[i];      //将i位置上的值赋给传参e 
	return OK;
}

Status LocateElem(SqList* L, ElemType target, int& position) {  //根据值查找元素的函数,用target来指示要找的值 
	for (int i = 1; i <= L->length; i++) {   //从头开始循环每一个数 
		if (L->elem[i] == target) {      //如果说这个i位置上的数与要找的target值相等 
			position = i;          //将i位置赋给position用来存放位置 
			return OK;           //成功找到 
		}
	}
	return ERROR; //未找到目标元素
}

Status InsertElem(SqList* L, int i, ElemType e) {        //插入函数,用e来存放要插入的值 
	if (i<1 || i>L->length + 1 || L->length == MAXSIZE)    //判断插入位置是否合法
		return ERROR;
	for (int j = L->length; j >= i; j--)          //依次将插入位置之后的元素后移一位 
		L->elem[j + 1] = L->elem[j];        //后移操作 
	L->elem[i] = e;          //将e中的待插入的值,放到当前位置当中 
	L->length++;       //线性表的长度增加 
	return OK;
 }

Status DeleteElem(SqList* L,int i,ElemType& e){     //删除函数,用e来存放被删除的值 
	if(i<1||i>L->length)    //判断删除位置是否合法(不为空或者超出范围) 
		return ERROR;
	e=L->elem[i];           //把当前位置的的值放到e里 
	for(int j=i;j<L->length;j++)   //依次把要删除位置之后的元素前移一位 
		L->elem[j]=L->elem[j+1];   //前移操作 
	L->length--;           //线性表长度减少 
	return OK;
}

int main() {
	SqList L;//定义线性表L
	InitList(&L);//取地址函数 
	cout << "请输入要创建的线性表的数据元素(5个数):" << endl;
	for (int i = 1; i <= 5; i++) {
		cin >> L.elem[i];//获取从键盘中输入的数据
		L.length++;//线性表表长+1
	}
	cout << "线性表中的数据元素为:" << " " ;
	for (int j = 1; j <= 5; j++)  //将线性表当中的元素依次输出 
		cout << L.elem[j] << " ";
	cout << endl;

	int position;//要取值的位置 
	cout << "请输入要取值的位置:";
	cin >> position;      //输入取值的位置 
	ElemType value;     //用value来存放要取值的位置 
	Status result = GetElem(&L, position, value);   //判断是否成功取值 
	if (result == OK)
		cout << "位置" << position << "的元素值为:" << value << endl;
	else
		cout << "取值失败,位置不合法" << endl;
	
	//查找:
	ElemType target; //定义目标值
	cout << "请输入要查找的值:";
	cin >> target;    //输入目标值 
	result = LocateElem(&L, target, position);  //调用查值函数判断是否成功 
	if (result == OK)
		cout << "元素值" << target << "在位置" << position << "上找到了" << endl;
	else
		cout << "线性表中不存在该值";

	//插入:
	int InsertPosition;  //定义找插入值的位置 
	ElemType InsertValue;   //定义要插入的值 
	cout << "请输入要插入的元素的位置和值:";
	cin >> InsertPosition >> InsertValue;  //依次输入 
	result = InsertElem(&L, InsertPosition, InsertValue);  //调用插入函数判断是否成功 
	if (result == OK) {
		cout << "成功插入元素,线性表现在为:";
			for (int k = 1; k <= L.length; k++) 
				cout << L.elem[k] << " ";
			cout<<endl; 
	}
	else
		cout << "插入失败" << endl;
	
	//删除
	int deletePosition;
	cout<<"请输入要删除的元素位置:";
	cin>>deletePosition;
	ElemType deleteValue;  //相当于e,用于保存删除的值
	result=DeleteElem(&L,deletePosition,deleteValue);
	if(result==OK){
		cout<<"删除操作成功,删除的元素值为:"<<deleteValue<<endl<<"删除后的线性表为:";
		for(int m=1;m<=L.length;m++){
			cout<<L.elem[m]<<" ";
		}
		cout<<endl;
	}
	else
		cout<<"删除位置不合法"<<endl;

}

评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注