一.实验目的 巩固线性表的数据结构的存储方法和相关操作,学会针对具体应用,使用线性表的相关知识来解决具体问题。 二..实验内容 建立一个由n个学生成绩的顺序表,n的大小由自己确定,每一个学生的成绩信息由自己确定,实现数据的对表进行插入、删除、查找等操作。分别输出结果。 (用静态链表来实现)
#include <iostream>
using namespace std;
const int Maxsize = 100;
template < class Datatype>
struct Node
{
Datatype data;
int next;
};
template <class Datatype>
class Static
{
public:
Static();
Static(Datatype a[], int n);
~Static() { };
int Length();
Datatype Get(int i);
int Locate(Datatype x);
void Insert(int i, Datatype x);
Datatype Delete(int i);
void Printlist();
private:
Node<Datatype> data[Maxsize];
int avail;
int first;
int length;
};
template <class Datatype>
Static<Datatype>::Static()
{
first = 0;
avail = 1;
data[0].next = -1;
for (int i = 1; i < Maxsize - 1; i++)
{
data[i].next = i + 1;
}
data[Maxsize - 1] = -1;
length = 0;
}
template <class Datatype>
Static<Datatype>::Static(Datatype a[], int n)
{
int s;
length = 0;
if (n > Maxsize || n < 0) throw "错误";
for(int i=0;i<Maxsize;i++)
{
data[i].next = i + 1;
}
data[Maxsize].next = -1;
first = 0;
avail = 1;
data[first].next = -1;
for (int j = 0; j < n; j++)
{
s = avail;
avail = data[avail].next;
data[s].data = a[j];
data[s].next = data[first].next;
data[first].next = s;
length++;
}
}
template <class Datatype>
int Static<Datatype>::Length()
{
return length;
}
template <class Datatype>
Datatype Static<Datatype>::Get(int i)
{
int p = first;
if (i<0 || i>length) throw"错误";
for (int j = 1; j <= i; j++)
{
if (data[p].next == -1) throw "错误";
p = data[p].next;
}
return data[p].data;
}
template <class Datatype>
int Static<Datatype>::Locate(Datatype x)
{
int p = first;
int count = 0;
while (data[p].next != -1)
{
if (data[p].data == x) { return count; }
p = data[p].next;
count++;
}
return 0;
}
template <class Datatype>
void Static<Datatype>::Insert(int i, Datatype x)
{
if (i<0 || i>Maxsize) throw "位置";
int p = first;
int s = avail;
data[s].data = x;
avail = data[s].next;
int count = 0;
for (count = 0; count < i - 1; count++)
{
p = data[p].next;
}
length++;
data[s].next = data[p].next;
data[p].next = s;
}
template <class Datatype>
Datatype Static<Datatype>::Delete(int i)
{
if (i<0 || i>length) throw "位置";
int p = first;
int count = 0;
while (data[p].next != -1 && count < i - 1)
{
p = data[p].next;
count++;
}
int q = data[p].next;
Datatype x = data[q].data;
data[p].next = data[q].next;
data[q].next = avail;
avail = q;
length--;
return x;
}
template <class Datatype>
void Static<Datatype>::Printlist()
{
int p = data[first].next;
while (p!=-1)
{
cout << data[p].data << " ";
p = data[p].next;
}
}
int main()
{
int b[10] = { 100,95,90,85,80,75,70,65,60,55 };
Static<int>c(b, 10);
cout << "显示所有学生的成绩" << endl;
c.Printlist();
cout << endl;
cout << "学生总数为:" << c.Length() << endl;
cout << "查找的第六位学生的成绩为:" << endl;
cout << c.Get(6) << endl;
cout << "查找成绩为90的学生:" << endl;
cout << c.Locate(90) << endl;
cout << "在第五个学生前插入成绩为73的学生" << endl;
c.Insert(5, 73);
cout << "插入后显示所有学生成绩" << endl;
c.Printlist();
cout << endl;
cout << "删除第一个学生成绩后剩下学生的成绩为:" << endl;
c.Delete(1);
c.Printlist();
}