1004_线性表操作

来源:互联网 发布:ARPU数据展示模版 编辑:程序博客网 时间:2024/06/05 19:23

比赛描述

线性表是n个元素的有序集合(n≥0),n是线性表中元素的个数,称为线性表的长度。可以用一组地址连续的存储单元依次存储线性表中元素,采用这种存储方式的线性表称为顺序表。

请在顺序表上实现运算,实现顺序表的逆置,删除表中所有元素值等于x的元素。

输入

三组数据,顺序表元素类型分别为整型、字符型和实型。

每一组第一行给出元素数目n(0<n≤1000),第二行给出元素数值,第三行给出待删除的元素。

输出

三组数据,每一组第一行给出逆置后的顺序表元素,第二行是在此基础上删除指定元素后的顺序表元素,每一个输出元素后均有一个空格,如果元素全部被删除,那么输出一个空行。

样例输入

8
1 2 3 7 5 6 7 8 
7
3
a c m
h
4
1.2 3.4 5.6 7.8
1.2

样例输出

8 7 6 5 7 3 2 1 
8 6 5 3 2 1 
m c a 
m c a 
7.8 5.6 3.4 1.2 
7.8 5.6 3.4 


先看如下代码:

#include <iostream>using namespace std;int main(){int n1, n2, n3;int da, *a;char db, *b;double dc, *c;cin >> n1;a = new int[n1];for (int i = 0; i < n1; i++)cin >> a[i];cin >> da;cin >> n2;b = new char[n2];for (int i = 0; i < n2; i++)cin >> b[i];cin >> db;cin >> n3;c = new double[n3];for (int i = 0; i < n3; i++)cin >> c[i];cin >> dc;for (int i = n1 - 1; i >= 0; i--)cout << a[i] << " ";cout << endl;for (int i = n1 - 1; i >= 0; i--){if (a[i] != da)cout << a[i] << " ";}cout << endl;for (int i = n2 - 1; i >= 0; i--)cout << b[i] << " ";cout << endl;for (int i = n2 - 1; i >= 0; i--){if (b[i] != db)cout << b[i] << " ";}cout << endl;for (int i = n3 - 1; i >= 0; i--)cout << c[i] << " ";cout << endl;for (int i = n3 - 1; i >= 0; i--){if (c[i] != dc)cout << c[i] << " ";}cout << endl;delete[]a;delete[]b;delete[]c;return 0;}
运行结果:



注意事项:

1.顺序表采用动态内存分配。

2.程序最后要释放内存。

代码分析:虽然此法能够按照要求输入输出,但实质上线性表并没有完成逆置,和元素删除。有点投机取巧

再看如下代码:

#include <iostream>using namespace std;template <typename T>class MyList{public:MyList();//默认构造函数初始化线性表~MyList();void ShowList();//输出 线性表void ReverseList();//调转线性表void DelElemetAndShow();//删除元素并且输出private:T * list;T delet;//要删除的数据int len;//当前长度static const int MaxSize=1000;//最大长度};template <typename T>MyList<T>::MyList(){int le;cin >> le;len = le;list = new T[le];int i = 0;while (cin>>list[i]){i++;if (i > len - 1)break;}cin >> delet;}template <typename T>MyList<T>::~MyList(){delete[]list;}template <typename T>void MyList<T>::ShowList(){for (int i = 0; i < len; i++)cout << list[i] << " ";cout << endl;}template <typename T>void MyList<T>::ReverseList(){for (int i = 0;i<len-i-1; i++){T temp;temp = list[i];list[i] = list[len - i - 1];list[len - i - 1] = temp;}}template <typename T>void MyList<T>::DelElemetAndShow(){int n=0;//用以记录ele数目for (int i = 0; i < len; i++){if (list[i] == delet)n++;elselist[i - n] = list[i];}len -= n;if (n == len)cout << endl;elseShowList();}template <typename T>void ACM1004(){MyList<T> a;a.ReverseList();a.ShowList();a.DelElemetAndShow();}int main(){ACM1004<int>();ACM1004<char>();ACM1004<double>();return 0;}
代码分析:

1.采用类模板,对三种不同类型进行重载

2.析构函数用delete对内存进行了释放

3.是在顺序表上实现的,单链表实现请转到http://blog.csdn.net/changshu1/article/details/47251969


知识点整理:

1.类模板的使用http://blog.csdn.net/a2415180498/article/details/50785747

2.数据结构线性表C++表示http://blog.csdn.net/a2415180498/article/details/50789678




0 0
原创粉丝点击