问题:用顺序表创建学生信息包括姓名,学号,语数外3科成绩,并对顺序表实现基本的操作。
1、LinearList.h
#ifndef _LINEARLIST_H_
#define _LINEARLIST_H_
#include<iostream>
using namespace std;
template<class T> //T为数据类型
class LinearList //模板名
{
private:
int length; //当前数组元素个数
int Maxsize; //线性表中最大元素个数
T*element; //一维动态数组
public:
LinearList(int LLMaxsize); //构造函数,创建空表
~LinearList(); //析构函数,删除表
LinearList<T>&InSert(int k, const T & x); //在第K个位置插入元素x,返回插入后的线性表
bool IsEmpty()const; //判断表是否为空,表空返回true,非空返回false
int GetLength()const; //返回表中数据元素个数
bool GetData(int k, T & x); //将表中第k个元素返回到x中,不存在返回false
bool ModifyData(int k, const T & x); //将表中第k个元素修改为x,不存在返回false
int Find(const T &x); //返回x在表中的位置,不存在返回0
LinearList<T>&DeleteByIndex(int k, T & x); //删除表中第k个元素,并把它保存在x中,返回修改后的线性表
LinearList<T>&DeleteByKey(const T & x, T & y); //删除表中关键字为x元素,返回删除后的线性表
void OutPut(ostream&out)const; //输出线性表的每个元素
};
template <class T>//实现构造函数
LinearList<T>::LinearList(int LLMaxsize)
{
Maxsize = LLMaxsize;
element = new T[LLMaxsize];
length = 0;
}
template <class T> //实现析构函数
LinearList<T>::~LinearList()
{
delete[] element;
}
template <class T>//实现插入新数据元素
LinearList<T> & LinearList<T>::InSert(int k, const T & x)
{
if (k<1 || k>length + 1)
cout << "元素下标越界,添加元素失败" << endl;
else
if (length == Maxsize)
cout << "此表已满,无法添加新元素" << endl;
else
{
for (int i = length; i > k - 1; i--)
element[i] = element[i - 1];
element[k - 1] = x;
length++;
}
return *this;
}
template <class T>//实现判断是否为空表
bool LinearList<T>::IsEmpty() const
{
return length == 0;
}
template <class T>//求当前表的长度
int LinearList<T>::GetLength() const
{
return length;
}
template <class T>//实现按位置取元素
bool LinearList<T>::GetData(int k, T&x)
{
if (k<1 || k>length)
return false;
else
{
x = element[k - 1];
return true;
}
}
template <class T>//实现按位置修改元素
bool LinearList<T>::ModifyData(int k, const T&x)
{
if (k<1 || k>length)
return false;
else
{
element[k - 1] = x;
return true;
}
}
template <class T>//实现按关键字查找
int LinearList<T>::Find(const T&x)
{
for (int i = 0; i < length; i++)
if (element[i] == x)
return i + 1;
return 0;
}
template <class T>//实现按位置删除
LinearList<T> & LinearList<T>::DeleteByIndex(int k, T & x)
{
if (GetData(k, x))
{
for (int i = k - 1; i < length - 1; i++)
element[i] = element[i + 1];
length--;
}
else
cout << "元素下标越界,删除失败" << endl;
return *this;
}
template <class T>//实现按关键字删除
LinearList<T> & LinearList<T>::DeleteByKey(const T & x, T&y)
{
int index = Find(x);
if (index != 0)
return DeleteByIndex(index, y);
else
{
cout << "没有此元素,删除失败" << endl;
}
return *this;
}
template <class T>//实现数据元素的输出
void LinearList<T>::OutPut(ostream & out) const
{
for (int i = 0; i < length; i++)
out << element[i] << endl;
}
//全局函数,实现重载运算符<<
template<class T>
ostream& operator<<(ostream &out, const LinearList<T> & x)
{
x.OutPut(out);
return out;
}
#endif
2、Node.h
//数据元素Node类
#ifndef _NODE_H_
#define _NODE_H_
#include <iostream>
#include <string>
using namespace std;
class Node
{
private:
string StdNumber;
string StdName;
int Score[3];
public:
Node(string & NumberOfStudent, string & NameOfStudeng, int grade[]);//有参构造函数
Node();//无参构造函数
Node&GetNode();//得到结点数据
void OutPutNode(ostream&out)const;//输出结点数据
};
//实现构造函数
Node::Node(string & NumberOfStudent, string & NameOfStudeng, int grade[])
{
StdNumber= NumberOfStudent;
StdName= NameOfStudeng;
for (int i = 0;i < 3; i++)
Score[i] = grade[i];
}
Node::Node()
{
}
Node & Node::GetNode()
{
return *this;
}
void Node::OutPutNode(ostream&out)const
{
out << StdNumber << StdName << endl;
out << "语文:" << Score[0];
out << "数学:" << Score[1];
out << "英语:" << Score[2];
}
//全局函数,重载插入运算符
ostream&operator<<(ostream&out, const Node&x)
{
x.OutPutNode(out);
return out;
}
#endif
3、main
#include "Node.h"
#include "LinearList.h"
#include<iostream>
#include<string>
using namespace std;
int main()
{
LinearList<Node> NodeLList(100);
int grade1[3] = { 99,100,95 };
int grade2[3] = { 95,198,95 };
int grade3[3] = { 99,89,95 };
string StdNumber1 = "100001"; //创建学生1
string StdName1 = "tom";
Node Node1(StdNumber1, StdName1, grade1);
string StdNumber2 = "100002"; //创建学生2
string StdName2 = "jerry";
Node Node2(StdNumber2, StdName2, grade2);
string StdNumber3 = "100003"; //创建学生3
string StdName3 = "xiaoming";
Node Node3(StdNumber3, StdName3, grade1);
cout << Node1 << endl; //输出学生1
Node x; //创建空对象
NodeLList.InSert(1, Node1); //插入学生1
NodeLList.InSert(1, Node2); //插入学生2
NodeLList.InSert(1, Node3); //插入学生3
cout << "当前表的长度为:" << NodeLList.GetLength() << endl;
cout << NodeLList << endl; //输出此时链表
int getnum=NodeLList.GetData(2, x);
if(getnum==1)
cout << x << endl; //输出第二个位置的元素
NodeLList.DeleteByIndex(3, x);//删除第三个位置的元素
cout << NodeLList << endl;
}
4、测试结果