双链表的基本使用及其应用(实验2.2)
来源:互联网 发布:weibull 7软件下载 编辑:程序博客网 时间:2024/06/03 21:26
一.实验目的
巩固线性表的数据结构的存储方法和相关操作,学会针对具体应用,使用线性表的相关知识来解决具体问题。
二.实验内容
1.建立一个由n个学生成绩的顺序表,n的大小由自己确定,每一个学生的成绩信息由自己确定,实现数据的对表进行插入、删除、查找等操作。分别输出结果。
#include <iostream> #include<string> using namespace std; struct Student { string name; int Chinese; int Math; int English; int Sum; }; ostream& operator << (ostream& os, const Student &ob) { os << ob.name << "\t"; os << ob.Chinese << "\t"; os << ob.Math << "\t"; os << ob.English << "\t"; os << ob.Sum << "\t"; return os; } template <class DataType> struct Node { DataType data; Node<DataType> *prior, *next; }; template <class DataType> class DoubleLink { public: DoubleLink(); DoubleLink(DataType a[], int n); ~DoubleLink(); int Length(); DataType Get(int i); int Locate(string x); void Insert(DataType x, int i); DataType Delete(int i); void PrintList(); private: Node<DataType> * first; // 定义头指针 Node<DataType> * last; // 定义尾指针 int length; }; template <class DataType> void DoubleLink<DataType> ::PrintList() { Node<DataType>*p; p = first->next; //工作指针P初始化 cout << "-------------------------------------" << endl; cout << "姓名" << "\t" << "语文" << "\t" << "数学" << "\t" << "英语" << "\t" << "总分" << "\t" << endl; for (int i = 0; i < length; i++) { cout << p->data << endl; p = p->next; } cout << "-------------------------------------" << endl; } template <class DataType> int DoubleLink<DataType>::Length() { return length; } template <class DataType> DataType DoubleLink<DataType>::Get(int i) { Node<DataType>*p = NULL; p = first->next; int count = 1; while (p != NULL&&count<i) { p = p->next; count++; } if (p == first) throw"输入位置异常"; else { return p->data; } } template <class DataType> int DoubleLink<DataType>::Locate(string x) { Node<Student>*p = NULL; p = first->next; int count = 1; while (p != first) { if (p->data.name == x) return count; p = p->next; count++; } return 0; } template <class DataType> void DoubleLink<DataType>::Insert(DataType x, int i) { Node<DataType>*p, *s; p = first->next; int count = 1; while (p != first && count < i - 1) { p = p->next; count++; } if (p == first)throw "插入位置异常"; else { s = new Node<DataType>; s->data = x; s->prior = p; s->next = p->next; (p->next)->prior = s; p->next = s; s->data.Sum = s->data.Chinese + s->data.Math + s->data.English; length++; } } template <class DataType> DoubleLink <DataType>::DoubleLink() { first = new Node<DataType>; first->next = first; length = 0; } template <class DataType> DoubleLink<DataType>::DoubleLink(DataType a[], int n) //尾插法 { Node<DataType> *s; //s为工作指针 first = new Node<DataType>; first->prior = last; last = first; //尾指针初始化 for (int i = 0; i < n; i++) { s = new Node<DataType>; //为每个数组元素建立一个结点 s->data = a[i]; s->prior = last; last->next = s; //将结点s插入到终端结点之后 last = s; length++; } last->next = first; //链接建立完毕,将终端结点的指针域指向头指针 } template <class DataType> DataType DoubleLink<DataType>::Delete(int i) { Node<DataType>*p; //工作指针初始化 p = first->next; int count = 0; while (p != first&&count < i - 1) { p = p->next; count++; } if (p == first || p->next == NULL) throw "删除位置异常"; else { DataType x = p->data; (p->prior)->next = p->next; (p->next)->prior = p->prior; delete p; length--; return x; } } template <class DataType> DoubleLink <DataType>::~DoubleLink() { Node<DataType>*p = first; //工作结点p初始化 for (int i = 0; i < length; i++) { p = first; first = first->next; delete p; } length = 0; cout << "链表已成功删除。" << endl; } int main() { Student stu[100]; //最大容纳量 int num; string TempName; cout << "请输入学生人数:"; cin >> num; for (int i = 0; i < num; i++) { cout << "输入“break”退出输入" << endl; cout << "请输入第" << i + 1 << "名学生姓名:"; cin >> TempName; if (TempName == "break") { num = i; break; } stu[i].name = TempName; cout << "请输入第" << i + 1 << "名学生语文成绩:"; cin >> stu[i].Chinese; cout << "请输入第" << i + 1 << "名学生数学成绩:"; cin >> stu[i].Math; cout << "请输入第" << i + 1 << "名学生英语成绩:"; cin >> stu[i].English; stu[i].Sum = stu[i].Chinese + stu[i].Math + stu[i].English; cout << "-------------------------------------" << endl; } DoubleLink<Student> demo(stu, num); demo.PrintList(); cout << "链表总长为:"; cout << demo.Length()<<endl; cout << "-------------------------------------" << endl; cout << "查找第三名学生成绩:" << endl; cout << "-------------------------------------" << endl; cout << "姓名" << "\t" << "语文" << "\t" << "数学" << "\t" << "英语" << "\t" << "总分" << "\t" << endl; cout << demo.Get(3) << endl; cout << "-------------------------------------" << endl; cout << "查找姓名为“小明”的位置:" << demo.Locate("xx") << endl; cout << "-------------------------------------" << endl; cout << "在第三与第四间插入“小叶”同学的成绩" << endl; cout << "链表总长为:"; cout << demo.Length()<<endl; cout << "-------------------------------------" << endl; cout << "删除第2位同学的成绩" << endl; demo.Delete(2); demo.PrintList(); return 0; }
三、实验心得:
通过本次实验,我基本掌握了双链表的基本操作。链表的内涵并非像数组、类、结构体、联合体等那样,链表不是C++语言中的关键词,链表是我们利用C++语言中的基本数据类型构造出来的结构,具有动态申请内存和增删效率高的特点。
阅读全文
0 0
- 双链表的基本使用及其应用(实验2.2)
- 双链表的基本使用及其应用(实验2.2)
- 实验一线性表的基本操作实现及其应用
- 实验一 线性表的基本操作实现及其应用
- 顺序表的基本操作实现及其应用(实验1)
- 实验一线性表的基本操作实现及其应用
- 实验一线性表的基本操作实现及其应用
- 实验一线性表的基本操作实现及其应用
- 实验一 线性表的基本操作实现及其应用
- 实验一线性表的基本操作实现及其应用
- 实验一线性表的基本操作实现及其应用
- 实验一线性表的基本操作实现及其应用
- 实验一 线性表的基本操作实现及其应用
- 实验一线性表的基本操作实现及其应用
- 实验一线性表的基本操作实现及其应用
- 实验一线性表的基本操作实现及其应用
- 实验一线性表的基本操作实现及其应用
- 实验一 线性表的基本操作实现及其应用
- 两种用c语言解决亲密数问题的方法并比较程序运行时间
- Tensorflow Example Resources
- Linux下用户登录查看常用命令
- 六度空间
- 请大神讲解
- 双链表的基本使用及其应用(实验2.2)
- 解决Pr, AE在渲染时输出出错的问题
- BZOJ 4562: [Haoi2016]食物链 拓扑排序+DP(其实是递推)
- C++中引用(&)的用法和应用实例
- python3.5+selenium3.4自动化测试10_selenium框架2.0-unittest(下)
- Codeforces Round #411 (Div. 2) E
- 聚沙成塔--爬虫系列(二)(python3基础语法)
- unity_NGUI系统学习(十三)_使用脚本监听控件的值修改,取得控件的值
- 欧拉函数--打表法与直接求值法