#pragma once
template
class LinearList
{
public:
LinearList(int LLMaxSize)//构造函数,创建空表
{
MaxSize = LLMaxSize;
element = new T[LLMaxSize];
length = 0;
}
LinearList()//析构函数,删除表
{
delete[]element;
}
LinearList& Insert(int k, const T &x)//在第k个位置插入元素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++;//表长+1
}
return *this;
}
bool IsEmpty() const//判断表是否为空,表空返回true,表非空返回false
{
return length == 0;
}
int GetLength() const//返回表中数据元素的个数
{
return length;
}
bool GetData(int k, T &x)//将表中第k个元素保存到x中,不存在返回false
{
if (k<1 || k>length)
{
return false;
}
else
{
x = element[k - 1];
return true;
}
}
bool ModifyData(int k, const T &x)//将表中第k个元素修改为x,不存在则返回false
{
if (k<1 || k>length)
{
return false;
}
else
{
element[k - 1] = x;
return true;
}
}
int Find(const T&x)//返回x在表中的位置,如果x不在表中返回0
{
for (int i = 0; i < length; i++)
{
if (element[i] == x)
{
return i + 1;
}
}
return 0;
}
LinearList & DeleteByIndex(int k, T&x)//删除表中第k个元素,并把它保存到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;
}
LinearList & DeleteByKey(const T& x, T& y)//删除表中关键字为x元素,返回删除后的线性表
{
int index = Find(x);//得到要删除的元素的位置
if (index != 0)
return DeleteByIndex(index, y);
else
{
cout << "没有此元素,删除失败" << endl;
return *this;
}
}
void OutPut(ostream& out) const//将线性表放到输出流out中输出
{
for (int i = 0; i < length; i++)
{
out << element[i] << endl;
}
}
private:
int length;
int MaxSize;
T *element;
};
//重载插入运算符<<
template
ostream&operator<<(ostream&out, const LinearList& x)
{
x.OutPut(out);
return out;
}
#include
#include
using namespace std;
#include"LinearList.h"
int main()
{
LinearListIntegerLList(10);//声明最多有10个以int为数据元素的顺序表对象
int x, y;
//依次插入100、200、300、400。。。
IntegerLList.Insert(1, 100);
IntegerLList.Insert(2, 200);
IntegerLList.Insert(3, 300);
IntegerLList.Insert(4, 400);
cout << "当前表的长度为:" << IntegerLList.GetLength() << endl;
cout << "当前表的元素为:\n" << IntegerLList << endl;
//读取并输出表中第3个元素的值,判断元素100在表中的位置
if (IntegerLList.GetData(3, x))
{
cout << "表中第3个元素为:" << x << endl;
}
x = 100;
cout << "元素100在表中的位置为:" << IntegerLList.Find(x) << endl;
//将100修改为150,删除200和400后,显示当前表的相关信息
x = 150;
IntegerLList.ModifyData(1, x);
IntegerLList.DeleteByIndex(2, x);
x = 400;
IntegerLList.DeleteByIndex(x, y);
cout << "当前表的长度为:" << IntegerLList.GetLength() << endl;
cout << "当前表的元素为:\n" << IntegerLList << endl;
#pragma once
#include
#include
using namespace std;
class Node
{
public:
Node(string NumberOfStudent, string NameOfStudent, int grade[])
{
StdNumber = NumberOfStudent;
StdName = NameOfStudent;
for (int i = 0; i < 3; i++)
{
Score[i] = grade[i];
}
}
Node()//无参构造函数
{
}
Node& GetNode()//得到结点数据
{
return *this;
}
void OutPutNode(ostream& out) const//输出结点数据
{
out << StdNumber << " " << StdName << endl;
out << "语文:" << Score[0]<<" ";
out << "数学:" << Score[1]<<" ";
out << "英语:" << Score[2]<<" ";
}
private:
string StdNumber;
string StdName;
int Score[3];
};
ostream& operator<<(ostream& out, const Node& x)
{
x.OutPutNode(out);
return out;
}
#include
#include
using namespace std;
#include"LinearList.h"
#include"Node.h"
int main()
{
LinearListNodeLList(10);//最多有10个以Node对象为数据元素的顺序表
int grade1[3] = { 99,100,95 };
int grade2[3] = { 95,98,88 };
int grade3[3] = { 90,90,90 };
Node Node1("10001", "张三", grade1);
Node Node2("10002", "李四", grade2);
Node Node3("10003", "王五", grade3);
Node x;
//将两个结点插入表中
NodeLList.Insert(1, Node1);
NodeLList.Insert(2, Node2);
//显示当前表的状态
cout << "当前表的长度为:" << NodeLList.GetLength() << endl;
cout << "当前表的元素为:\n" << NodeLList << endl;
//将表中第2个元素输出
NodeLList.GetData(2, x);
cout << "表中第2个元素为:\n" << x << endl;
//删除表中第2个元素,修改第一个元素的信息,显示当前表的状态
NodeLList.DeleteByIndex(2, x);
cout << "刚刚删除的元素为:\n" << x << endl;
NodeLList.ModifyData(1, Node3);
cout << "当前表的长度为:" << NodeLList.GetLength() << endl;
cout << "当前表的元素为:\n" << NodeLList << endl;
system("pause");
return 0;
}
1、顺序表具有简单、存储密度大、空间利用效率高、存储效率高等优点。
2、在顺序表中进行插入与删除操作时,往往需要移动大量的数据元素,浪费时间。
3、在实际应用中由于顺序表的长度不好估计,往往需要为顺序表分配足够大的内存空间,造成浪费。
所以,对于元素变动频繁、长度变化较大的线性表,不宜采用顺序存储结构。