数据结构----顺序表的基本操作

顺序表三个重要组成部分:
1.顺序表的首地址,即存储的首地址
2.顺序表的长度
3.顺序表的大小

顺序表的基本操作:
1.建立和初始化
2.末尾添加元素
3.插入元素
4.删除指定位置的元素
5.删除指定数据的元素
6.销毁顺序表

自己的理解:
顺序表作为一种最简单的数据结构,类似于数组的升级版。也就是一个动态数组.也随时可以知道他现在有几个元素。

1.建立和初始化:
这个部分,根据顺序表的基本组成部分可知,应该建立一个结构体,定义一个指定类型的数据的指针,一个长度,一个大小
初始化的时候再根据指定的大小,动态分配一快内存给指针:

//定义循序表
#define MAX_SIZE 100
typedef struct sq_list {
    
    
	int* elmes;   //顺序表的首地址
	int length;   //顺序表的长度
	int size;	  //顺序表的大小
}list;
//初始化循序表
bool initlist(list& my_list) {
    
    
	my_list.elmes = new int[MAX_SIZE];
	if (!my_list.elmes) {
    
    
		cout << "分配内存失败!" << endl;
		return false;
	}
	my_list.length = 0;
	my_list.size = MAX_SIZE;
	return true;
}

2.末尾添加元素
这个就是通过长度来实现的,长度就是最后一个元素的下一个位置,所以赋值的时候直接用长度就可,并且再赋值完以后,长度+1

bool Append(list &my_list,int e) {
    
    
	if (my_list.length == my_list.size) {
    
    
		cout << "空间已满!" << endl;
		return  false;
	}
	my_list.elmes[my_list.length] = e;
	my_list.length++;
	return true;
}

3.插入元素
因为循序表规定中间不能空,所以从要插入的位置开始,将后面的数据都向后以一个位置,腾出一个空间,将要插入的元素插入进去。再将长度+1

bool listinsert(list &my_list,int i,int e) {
    
    
	if (i < 0 || i >= my_list.length) {
    
    
		cout << "要插入的位置不合理" << endl;
		return false;
	}
	if (my_list.length == my_list.size) {
    
    
		cout << "空间已满" << endl;
		return false;
	}
	//将数据往后移动一位
	for (int j = my_list.length - 1;j >= i;j--) {
    
    
		my_list.elmes[j + 1] = my_list.elmes[j];
	}
	my_list.elmes[i] = e;
	my_list.length++;
	return true;
}

4.删除指定位置的元素
5.删除指定数据的元素
将数据向前覆盖,再将长度-1,第5个与第4个的区别就是想要找到指定的元素的位置,再进行覆盖。

bool listDelete(list &list,int pos) {
    
    
	if (pos < 0 || pos >= list.length) {
    
    
		return false;
	}
	for (int i = pos;i < list.length - 1;i++) {
    
    
		list.elmes[i] = list.elmes[i + 1];
	}
	list.length--;
	return true;
}
bool listDelteF(list &list,int date) {
    
    
	int index = -1;
	for (int i = 0;i < list.length;i++) {
    
    
		if (list.elmes[i] == date) {
    
    
			index = i;
			break;
		}
	}
	if (index == -1) {
    
    
		cout << "没有找到要删除的数据";
		return false;
	}
	for (int i = index;i < list.length - 1;i++) {
    
    
		list.elmes[i] = list.elmes[i + 1];
	}
	list.length--;
	return true;
}

6.销毁顺序表
就是分配的内存空间删除掉,节省内存空间

void destroyList(list &list) {
    
    
	if (list.elmes) delete[] list.elmes;
	list.length = 0;
	list.size = 0;
}	

完整代码如下:

#include<iostream>
#include<Windows.h>
using namespace std;
#define MAX_SIZE 100
typedef struct sq_list {
    
    
	int* elmes;   //顺序表的首地址
	int length;   //顺序表的长度
	int size;	  //顺序表的大小
}list;
bool initlist(list& my_list) {
    
    
	my_list.elmes = new int[MAX_SIZE];
	if (!my_list.elmes) {
    
    
		cout << "分配内存失败!" << endl;
		return false;
	}
	my_list.length = 0;
	my_list.size = MAX_SIZE;
	return true;
}
void listprint(list& my_list) {
    
    
	cout << "顺序表的大小:" << my_list.size << " "
		<< "顺序表的长度:" << my_list.length << endl;
	for (int i = 0;i < my_list.length;i++) {
    
    
		cout << my_list.elmes[i]<<" ";
	}
	cout << endl;
}
bool Append(list &my_list,int e) {
    
    
	if (my_list.length == my_list.size) {
    
    
		cout << "空间已满!" << endl;
		return  false;
	}
	my_list.elmes[my_list.length] = e;
	my_list.length++;
	return true;
}
bool listinsert(list &my_list,int i,int e) {
    
    
	if (i < 0 || i >= my_list.length) {
    
    
		cout << "要插入的位置不合理" << endl;
		return false;
	}
	if (my_list.length == my_list.size) {
    
    
		cout << "空间已满" << endl;
		return false;
	}
	for (int j = my_list.length - 1;j >= i;j--) {
    
    
		my_list.elmes[j + 1] = my_list.elmes[j];
	}
	my_list.elmes[i] = e;
	my_list.length++;
	return true;
}
bool listDelete(list &list,int pos) {
    
    
	if (pos < 0 || pos >= list.length) {
    
    
		return false;
	}
	for (int i = pos;i < list.length - 1;i++) {
    
    
		list.elmes[i] = list.elmes[i + 1];
	}
	list.length--;
	return true;
}
bool listDelteF(list &list,int date) {
    
    
	int index = -1;
	for (int i = 0;i < list.length;i++) {
    
    
		if (list.elmes[i] == date) {
    
    
			index = i;
			break;
		}
	}
	if (index == -1) {
    
    
		cout << "没有找到要删除的数据";
		return false;
	}
	for (int i = index;i < list.length - 1;i++) {
    
    
		list.elmes[i] = list.elmes[i + 1];
	}
	list.length--;
	return true;
}
void destroyList(list &list) {
    
    
	if (list.elmes) delete[] list.elmes;
	list.length = 0;
	list.size = 0;
}	
int main() {
    
    
	list my_list;
	int count, e;
	int pos;
	//1.顺序表的初始化
	if (!initlist(my_list)) {
    
    
		cout << "初始化失败!" << endl;
	}
	listprint(my_list);
	//2.顺序表的添加数据
	cout << "请输入要输入几个数:";
	cin >> count;
	for (int i = 0;i < count;i++) {
    
    
		cout << "请输入数据:";
		cin >> e;
		if (Append(my_list, e)) {
    
    
			cout << "输入成功" << endl;
		}
		else {
    
    
			cout << "输入失败" << endl;
		}
	}
	listprint(my_list);
	//3.数据表的插入数据
	cout << "请输入您要插入的位置和数据:";
	cin >> pos >> e;
	if (listinsert(my_list, pos, e)) {
    
    
		cout << "插入成功!" << endl;
	}
	else {
    
    
		cout << "插入失败!" << endl;
	}
	listprint(my_list);
	//4.删除指定位置的元素
	cout << "请输入要删除的下表:";
	cin >> pos;
	if (listDelete(my_list, pos)) {
    
    
		cout << "删除成功!" << endl;
	}else {
    
    
		cout << "删除失败!" << endl;
	}
	listprint(my_list);
	//5.删除指定的元素
	int date;
	cout << "请输入要删除的元素:";
	cin >> date;
	if (listDelteF(my_list, date)) {
    
    
		cout << "删除成功!";
	}
	else {
    
    
		cout << "删除失败!";
	}
	listprint(my_list);
	//6.销毁顺序表
	destroyList(my_list);
	system("pause");
	return 0;
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_49324123/article/details/110921420