C++顺序表用vector定义,以及一个简单的插入算法

PS:四月末赶紧写一篇,保持每月全勤!!

//*************************************************************************************************************************

最近开始学习数据结构,手边有一本C描述的,作为C++的真爱粉,当然要把他们都改造成C++形式啦!!!


顺序表的C定义:

#define maxSize 100

typedef struct{
    int data[maxSize];
    int length;
}sqlist

具体意义很明显,数组存放数据,length存放长度。

C++定义:

#include<vector>
using namespace::std;
using std::vector;

typedef struct{
	vector<int> data;
	int length;
}sqlist;

这里我将data从数组改成了vector。

利用了C++的特性。

改成vector至少有两点好处:1.不会受限于数组的大小;2.更加灵活。



于是,在定义完一个线性表后,往里面插入数据时,有代码:

#include<iostream>
#include<vector>
using namespace::std;
using std::vector;

typedef struct{
	vector<int> data;
	int length;
}sqlist;

int main()
{
	sqlist L;
	int i=0;
	int L.length=0;
	while(cin>>i){
		L.data.push_back(i);
		++L.length;
	}
	cout<<"the length of the list"<<endl;	//观察添加元素后list的长度;
	//用范围for可以精确便捷的输出data
	for(auto &i:L.data){
		cout<<i<<endl;
	}
	return 0;
}

里面有两个要说明:

1.往vector后面添加元素时,必须使用vector的成员函数push_back(),不能使用下标直接在后面添加,否则会报错。

2.范围for循环,更加简洁,更加准确。但是必须注意,在范围for循环开始执行时,它的循环的范围必须是静止固定的,例如上述程序中:在范围for开始执行,不要改变vector的大小。


这可以算是完整的定义了一个顺序表了。



顺序表的常见操作----插入一个数

往顺序表中,按一些特设的要求,插入一个数。

比如,为了突出重点,我选择的条件是:在顺序表的第三个数据后面插入一个新的数据,则有代码:

#include<iostream>
#include<vector>
using namespace::std;
using std::vector;

typedef struct{
	vector<int> data;
	int length;
}sqlist;

int main()
{
	sqlist L;
	int i = 0;
	L.length = 0;	
	int isr = 0;
	cout << "please input the num you want to insert:" << endl;
	cin >> isr;
	while (cin >> i) {
		L.data.push_back(i);//在结构体变量L中的vector data
		++L.length;
	}
	for (auto &i : L.data) {
		cout << i << endl;
	}
	cout << "The length of the list is " << L.length << endl;
	Insert(L, isr);
	cout << "The length after inserting is: "<<L.length << endl;
	for (auto &i : L.data) {
		cout << i << endl;
	}
	return 0;
}
//函数功能:插入到第三个元素的后面
void Insert(sqlist &L, int i) {
	if (L.length < 3) {
		cerr << "the list is wrong!" << endl;
	}
	++(L.length);
	//cout << L.length << endl;
	int n = L.length;
	L.data.push_back(L.data[n - 2]);//此时,将vector的最后一位元素向后移动一位,vector增长一个
	//cout << "sadasd" << endl;
	for (n; n > 3;--n) {
		//vector 添加元素要用pusu_back,不能使用下标形式添加元素;
		//所以,要先添加元素,再进行循环;
		//此时,其余的元素便可以通过下标进行移动;
		L.data[n - 2] = L.data[n - 3];
	}
	L.data[3] = i;
}

既能实现这个功能。

说明三点:

1.还是vector往数据末尾添加元素,并扩充长度的操作,必须使用push_back()函数。

2.vector作为一个容器,与数组一样,下标引用时都是从0开始,所以在下标引用时必须注意不要越界。

3.vector可以使用下标引用的情况,是在已知vector有具体数据,并且下标不越界的情况下,空vector,以及下标引用直接往末尾添加元素,都是不可行的。

要特别注意!



猜你喜欢

转载自blog.csdn.net/xuchen1230/article/details/80148469
今日推荐