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,以及下标引用直接往末尾添加元素,都是不可行的。
要特别注意!