实验目的:
⑴熟悉线性表的定义和基本操作;
⑵掌握线性表的顺序存储结构设计与基本操作的实现。
实验内容与要求:
⑴定义线性表的顺序存储表示;
⑵基于所设计的存储结构实现线性表的基本操作;
⑶编写一个主程序对所实现的线性表进行测试;
⑷线性表的应用:①设线性表L1和L2分别代表集合A和B,试设计算法求A和B的并集C,并用线性表L3代表集合C;②(选做)设线性表L1和L2中的数据元素为整数,且均已按值非递减有序排列,试设计算法对L1和L2进行合并,用线性表L3保存合并结果,要求L3中的数据元素也按值非递减有序排列。
#includeusing namespace std; const int MAXSIZE = 100; template class SeqList { private: T *data; //存放数组 int length; //顺序表当前长度 public: //初始化 SeqList() { data = new T[MAXSIZE]; length = 0; } //创建顺序表 void create() { int n; cout << "请输入创建长度:"; cin >> n; cout << "请输入数据:"; for (int i = 0; i < n; i++) { cin>>data[i] ; length++; } if(length>0)cout << "创建成功!" << endl; } //取值 T getdata(int i) { return data[i-1]; } //插入 void insert(int i,T a) { for (int j = length; j >= i; j--) { data[j] = data[j - 1]; } data[i-1] = a; length++; } //删除 void Delete(int i) { for (int j = i - 1; j < length-1;j++) { data[j] = data[j+1]; } length--; } //获取当前长度 T get() { return length; } //打印 void print() { for (int i = 0; i < length; i++) { cout << data[i]<<" "; } } }; //两个顺序表的无序合并 template void merge2(SeqList L1, SeqList L2, SeqList & L3) { int k = 1; //合并L1 for (int i = 1; i <= L1.get(); i++) { L3.insert(k, L1.getdata(i)); k++; //去除重复元素 for (int j = 1; j <= L2.get(); j++) { if (L2.getdata(j) == L1.getdata(i))L2.Delete(j); } } //合并L2 for (int j = 1; j <= L2.get(); j++) { L3.insert(k, L2.getdata(j)); k++; } } //两个顺序表的非递减合并 template void merge(SeqList L1, SeqList L2,SeqList &L3) { int i=1,j=1,k = 1; //去除重复元素 for(int x=1;x<=L1.get();x++) for (int y = 1; y <= L2.get(); y++) { if (L2.getdata(y) == L1.getdata(x))L2.Delete(y); } while (1) { //判断顺序表一是否全部填入 if (i > L1.get()) { for (j; j <= L2.get(); j++) { L3.insert(k, L2.getdata(j)); k++; } break; } //判断顺序表二是否全部填入 if (j > L2.get()) { for (i; i <= L1.get(); i++) { L3.insert(k, L1.getdata(i)); k++; } break; } //依次判断两个顺序表元素大小 else { if (L1.getdata(i) < L2.getdata(j)) { L3.insert(k, L1.getdata(i)); i++; } else { L3.insert(k, L2.getdata(j)); j++; } k++; } } } //菜单 void show1() { cout << "---1.顺序表的实现" << endl; cout << "---2.顺序表的应用" << endl; cout << "---3.退出" << endl; cout << endl; } void show2() { cout << "---1.创建顺序表;" << endl; cout << "---2.取值;" << endl; cout << "---3.插入元素;" << endl; cout << "---4.删除元素;" << endl; cout << "---5.遍历;" << endl; cout << "---6.返回上一级;" << endl; cout << endl; } void show3() { cout << "---1.两个顺序表的有序合并;" << endl; cout << "---2.两个顺序表的无序合并;" << endl; cout << "---3.返回上一级" << endl; } int main() { int m = 1, n; char ch,ch2; while (1) { //主界面 if (m == 1) { system("cls "); show1(); cin >> n; if (n == 1) { m = 2; } if (n == 2) { m = 3; } if (n == 3)break; } //顺序表的实现 if (m == 2) { system("cls "); show2(); cin >> n; SeqList L; if (n == 1) { L.create(); } if (n == 2) { int x = 0; cout << "请输入取值位置:"; cin >> x; cout << L.getdata(x)< > i >> j; L.insert(i, j); cout << "插入成功!" << endl; } if (n == 4) { int x; cout << "请输入删除位置:"; cin >> x; L.Delete(x); cout << "删除成功!" << endl; } if (n == 5)L.print(); if (n == 6)m = 1; cout << endl << endl << "按下回车健执行下一步"; ch =cin.get(); ch2 = cin.get(); } //顺序表的应用 if (m == 3) { system("cls "); show3(); cin >> n; if (n == 3)m = 1; //有序合并 if (n == 1) { SeqList L1; SeqList L2; SeqList L3; cout << endl; cout << "正在创建顺序表一" << endl; L1.create(); cout << endl; cout << "正在创建顺序表二" << endl; L2.create(); cout << endl; merge(L1, L2, L3); cout << "两个顺序表的有序合并结果为:"; L3.print(); } //无序合并 if (n == 2) { SeqList L1; SeqList L2; SeqList L3; cout << endl; cout << "正在创建顺序表一" << endl; L1.create(); cout << endl; cout << "正在创建顺序表二" << endl; L2.create(); cout << endl; merge2(L1, L2, L3); cout << "两个顺序表的无序合并结果为:"; L3.print(); } cout << endl << endl << "按下回车健执行下一步"; ch = cin.get(); ch2 = cin.get(); } } }



