实验二 线性表综合实验—单链表
一.实验目的
巩固线性表的数据结构的存储方法和相关操作,学会针对具体应用,使用线性表的相关知识来解决具体问题。
二.实验内容
1.建立一个由n个学生成绩的顺序表,n的大小由自己确定,每一个学生的成绩信息由自己确定,实现数据的对表进行插入、删除、查找等操作。分别输出结果。
三.源代码
#include "stdafx.h"
#include<iostream>
using namespace std;
template<class DT>
struct Node
{
DT data;
Node<DT> *next;
};
template <class DT>
class LinkList
{
public:
LinkList();
LinkList(DT a[], int n);
~LinkList();
DT Get(int i);
int Locate(DT x);
void Insert(int i, DT x);
DT Delete(int i);
void PrintList();
private:
Node <DT>*first;
};
template <class DT>
void LinkList <DT>::PrintList() //遍历算法
{
Node<DT>*p = first->next;
while (p != NULL)
{
cout << p->data<<" ";
p = p->next;
}
cout << endl;
}
template <class DT>
DT LinkList<DT>::Get(int i) //按位查找
{
Node<DT> *p = first->next;
int count = 1;
while (p != NULL && count < i)
{
p = p->next;
count++;
}
if (p == NULL)throw"位置";
else return p->data;
}
template <class DT>
int LinkList<DT>::Locate(DT x) //按值查找算法
{
Node<DT>*p = first->next;
int count = 1;
while (p != NULL)
{
if (p->data == x) return count;
p = p->next;
count++;
}
return 0;
}
template <class DT>
void LinkList<DT>::Insert(int i, DT x) //插入算法
{
Node<DT> *p = first, *s = NULL;
int count = 0;
while (p != NULL && count < i - 1)
{
p = p->next;
count++;
}
if (p == NULL)throw "位置";
else {
s = new Node<DT>; s->data = x;
s->next = p->next; p->next = s;
}
}
template <class DT>
LinkList <DT>::LinkList() //无参构造函数
{
first = new Node<DT>;
first->next = NULL;
}
template <class DT>
LinkList<DT>::LinkList(DT a[], int n)
{
Node<DT> *s,*r;
first = new Node<DT>;
r = first;
for (int i = 0; i < n; i++)
{
s = new Node<DT>; s->data = a[i];
r->next = s; r = s;
}
r->next = NULL;
}
template <class DT>
DT LinkList <DT>::Delete(int i) //删除算法
{
Node<DT>*p = first, *q = NULL;
DT x;
int count = 0;
while (p != NULL && count < i - 1)
{
p = p->next;
count++;
}
if (p == NULL || p->next == NULL)
throw "位置";
else {
q = p->next; x = q->data;
p->next = q->next;
delete q;
return x;
}
}
template <class DT>
LinkList <DT>::~LinkList() //析构函数
{
Node<DT>*q = NULL;
while (first != NULL)
{
q = first;
first = first->next;
delete q;
}
}
int main()
{
int score[8] = { 99,59,75,77,80,30,45,66 };
LinkList<int> List(score, 8);
List.PrintList(); //遍历学生分数
cout << List.Get(4) << endl; //取第4个位置的学生分数
List.Insert(3, 100); //在第三个位置插入学生分数
List.PrintList(); //再次遍历
cout << List.Locate(77) << endl; //获取分数为77的位置
cout << List.Delete(2) << endl; //删除第2个分数
List.PrintList(); //再次遍历
return 0;
}
四.实验总结
运行结果如上图所示(由于软件本身问题(应该是),如果显示中有中文的话则会出现乱码现象,所以在运行结果中并没有有中文解释)。
在课堂的时候听得懂,但是在操作实验却会出现很多问题,比如,类型的定义错误等等。在此次实验中并不是做得很顺利,但也学到并解决了不少不懂得知识点,所以在实验中才能更好地知道自己的不足之处。