<数据结构> 实验二 线性表的实验之一

来源:互联网 发布:js改变input的宽度 编辑:程序博客网 时间:2024/06/06 03:12

《数据结构》实验二:     线性表实验

一..实验目的

     巩固线性表的数据结构,学会线性表的应用。

1.回顾线性表的逻辑结构,线性表的物理存储结构和常见操作。

2.学习运用线性表的知识来解决实际问题。

3.进一步巩固程序调试方法。

4.进一步巩固模板程序设计。

二..实验内容

1.建立一个N个学生成绩的顺序表,对表进行插入、删除、查找等操作。分别输出结果。

要求如下:

1)用顺序表来实现。

2)用单链表来实现。


顺序表

//seq_scores.h#ifndef SCORES_H_#define SCORES_H_#include <iostream>#include <iomanip>using namespace std;const int MaxSize = 40;template <typename T>class Scores{private:T m_Data[MaxSize];int m_length;public:Scores();void m_Init();                                     //输入n个学生数据void m_Insert();                                  //在表中s的位置插入xvoid m_Find_Loc();                               //在表中查找序号为i的元素void m_Find_Val();                            //在表中查找值与x相等的元素void m_Del();                              //在表中删除序号为s的元素void m_Show();                                   //把表中所有元素打印出来void m_Ave();                                   //求表中所有元素的平均值int Get_length();                                //获取成绩表的长度void m_Seq();                                  //把表中所有元素按从小到大排序};#endiftemplate <typename T>Scores<T>::Scores(){m_length = 0;}template <typename T>void Scores<T>::m_Init(){cout << "\n输入操作" << endl;int n;cout << "\n成绩表还有" << MaxSize - m_length << "空位可供输入\n" << endl;cout << "\n请设定你要输入数据的数目:";cin >> n;while (n > MaxSize - m_length){cout << "\n抱歉!你要输入数据的数目大于成绩表剩余的空位.请重新输入一个正确的数目" << endl;cin >> n;}for (int i = 0; i < n; i++){cout << "\n第" << i + 1 << "个同学的成绩为:";cin >> m_Data[i];m_length++;}cout << "数据输入完毕.\n" << endl;this->m_Show();system("pause");                                                      //暂停system("cls");                                                        //清屏}template <typename T>void Scores<T>::m_Insert()                               //在序号为s的位置插入元素x{cout << "\n插入操作\n" << endl;this->m_Show();int s;T x;cout << "\n请输入你想要元素插入的位置序号:";cin >> s;cout << "\n请输入你要插入的学生成绩:";cin >> x;while (s > m_length + 1){cout << "\n插入位置有错." << endl;cout << "请重新插入输入的位置序号:";cin >> s;}if (m_length >= MaxSize){cout << "\n抱歉!成绩表满了,无法再插入数据." << endl;return;}else{for (int i = m_length - 1; i > s - 2; i--){m_Data[i + 1] = m_Data[i];}}m_Data[s - 1] = x;m_length++;cout << "\n数据插入完毕." << endl;cout << "\n\n";this->m_Show();system("pause");                                                      //暂停system("cls");                                                        //清屏}template<typename T>void Scores<T>::m_Find_Loc()             {cout << "\n按位查找操作\n" << endl;this->m_Show();if (m_length == 0){cout << "\n成绩表中没有数据,查询操作失败!!" << endl;return;}int i;cout << "\n请输入你要查找的成绩的序号:";cin >> i;while (i > MaxSize){cout << "\n你输入的序号大于成绩表的最大序号,请重新输入一个正确的序号:";cin >> i;}cout << "\n你查找的成绩为:" << m_Data[i - 1] << endl;system("pause");                                                      //暂停system("cls");                                                        //清屏}template <typename T>void Scores<T>::m_Find_Val(){cout << "\n按值查找操作\n" << endl;this->m_Show();if (m_length == 0){cout << "成绩表中没有数据,查询操作失败!!" << endl;return;}bool t = false;T x;cout << "请输入一个学生成绩:";cin >> x;for (int i = 0; i < m_length; i++){if (x == m_Data[i]){cout << "\n你查找的成绩的序号为:" << i + 1 << endl;t = true;}}if (t == false)cout << "\n成绩表中没有该成绩." << endl;system("pause");                                                      //暂停system("cls");                                                        //清屏}template <typename T>void Scores<T>::m_Del(){cout << "\n删除操作\n" << endl;this->m_Show();if (m_length == 0){cout << "成绩表中没有数据,删除操作失败!!" << endl;return;}int s;cout << "\n你输入你要删除的学生成绩的序号:";cin >> s;cout << "\n你删除的学生成绩为:" << m_Data[s] << endl;for (int i = s; i < m_length; i++){m_Data[i - 1] = m_Data[i];}cout << "\n该学生成绩删除完毕.\n" << endl;m_length--;this->m_Show();system("pause");                                                      //暂停system("cls");                                                        //清屏}template <typename T>void Scores<T>::m_Ave(){cout << "\n求平均值操作\n" << endl;this->m_Show();T sum = 0, ave;if (m_length == 0){cout << "成绩表中没有数据,求平均数操作失败!!" << endl;return;}for (int i = 0; i < m_length; i++)sum += m_Data[i];ave = sum / m_length;cout << "学生成绩的平均值为:" << ave << endl;system("pause");                                                      //暂停system("cls");                                                        //清屏}template <typename T>int Scores<T>::Get_length(){return m_length;}template <typename T>void Scores<T>::m_Seq(){cout << "\n排序操作\n" << endl;this->m_Show();T t;for (int i = 1; i < m_length; i++)for (int j = 0; j < m_length - i; j++){if (m_Data[j] > m_Data[j + 1]){t = m_Data[j];m_Data[j] = m_Data[j + 1];m_Data[j + 1] = t;}}cout << "\n";this->m_Show();system("pause");                                                      //暂停system("cls");                                                        //清屏}template <typename T>void Scores<T>::m_Show(){if (m_length == 0){cout << "成绩表中没有数据,显示操作失败!!" << endl;return;}cout << m_length << "名学生的成绩为:\n" << endl;for (int i = 0; i < m_length; i++){cout << m_Data[i] << '\t';}cout << "\n\n" << endl;}

//seq_main.cpp#include "seq_scores.h"#include <iostream>//#include <iomanip>using namespace std;int main(){Scores<int> sco;sco.m_Init();sco.m_Insert();sco.m_Find_Val();sco.m_Find_Loc();sco.m_Ave();sco.m_Seq();sco.m_Del();return 0;}

实验结果:


















单链表

//link_scores.h#ifndef SCORES_H_#define SCORES_H_#include <iostream>#include <iomanip>using namespace std;template <typename T>struct Node{T data;Node<T> *next;};template <typename T>class Scores{private:int m_length;Node<T> *head;public:Scores();void m_Init();                                     //输入n个学生数据void m_Insert();                                  //在表中s的位置插入xvoid m_Find_Loc();                               //在表中查找序号为i的元素void m_Find_Val();                            //在表中查找值与x相等的元素void m_Del();                              //在表中删除序号为s的元素void m_Destroy();                                   //删除成绩表void m_Show();                                   //把表中所有元素打印出来void m_Ave();                                   //求表中所有元素的平均值int Get_length();                                //获取成绩表的长度void m_Seq();               //把表中所有元素按从小到大排序};#endiftemplate <typename T>Scores<T>::Scores(){head = new Node<T>;head->next = NULL;m_length = 0;}template <typename T>void Scores<T>::m_Init(){cout << "\n输入操作\n" << endl;int n = 0;Node<T> *p, *q;q = head;if (head->next != NULL)head->next = NULL;cout << "请设置你要输入的学生成绩的数目:";cin >> n;for (int i = 0; i < n; i++){p = new Node<T>;cout << "\n请输入第" << i + 1 << "位学生的成绩";cin >> p->data;q->next = p;q = p;q->next = NULL;m_length++;}cout << "\n学生成绩输入完毕." << endl;cout << "\n";this->m_Show();system("pause");                        //暂停system("cls");                       //清屏}template <typename T>void Scores<T>::m_Insert(){cout << "\n插入操作\n" << endl;this->m_Show();int s;Node<T> *p, *t;p = head;cout << "请输入你想要插入学生成绩的位置:";cin >> s;while (s <= 0 || s > m_length + 1){cout << "/n插入的位置不正确,请重新输入一个正确的位置:";cin >> s;}for (int i = 0; i < s - 1; i++)p = p->next;t = new Node<T>;cout << "\n请输入你想插入的学生成绩:";cin >> t->data;t->next = p->next;p->next = t;m_length++;cout << "\n成绩插入完毕." << endl;cout << "\n";this->m_Show();system("pause");system("cls");}template <typename T>void Scores<T>::m_Find_Loc(){cout << "\n按位查找操作\n" << endl;this->m_Show();int s;Node<T> *p;p = head;cout << "请输入你想要查找的学生成绩的位置:";cin >> s;while (s <= 0 || s > m_length){cout << "\n你输入的位置有误,请重新输入一个正确的位置:";cin >> s;}for (int i = 0; i < s; i++)p = p->next;cout << "\n你想要查找的成绩为:";cout << p->data << endl;cout << "查找完毕." << endl;system("pause");system("cls");}template <typename T>void Scores<T>::m_Find_Val(){cout << "\n按值查找操作\n" << endl;this->m_Show();bool t = false;int i = 1;Node<T> *p;p = head->next;T x;cout << "请输入想要查找的成绩:";cin >> x;while (p != NULL){if (x == p->data){cout << "\n你查找的成绩的位置为:" << i << endl;t = true;}p = p->next;i++;}if (t == false)cout << "\n没有符合条件的学生成绩." << endl;system("pause");system("cls");}template <typename T>void Scores<T>::m_Del(){cout << "\n删除操作\n" << endl;this->m_Show();int s;Node<T> *p, *q;p = head;cout << "请输入你想要删除的学生成绩的位置为:";cin >> s;while (s <= 0 || s > m_length){cout << "\n你输入的位置有误,请重新输入一个正确的位置:";cin >> s;}for (int i = 0; i < s - 1; i++)p = p->next;q = p->next;p->next = q->next;cout << "\n你删除的成绩为:";cout << q->data << endl;delete q;m_length--;cout << "\n删除完毕." << endl;cout << "\n";this->m_Show();system("pause");system("cls");}template <typename T>void Scores<T>::m_Destroy(){Node<T> *p, *q;p = head;q = p;for (int i = 0; i < m_length; i++){q = q->next;delete p;p = q;}m_length = 0;//cout << "\n成绩表清空完毕." << endl;}template <typename T>void Scores<T>::m_Ave(){cout << "\n求平均值操作\n" << endl;this->m_Show();T sum = 0, ave;Node<T> *p;p = head->next;if (p == NULL){cout << "\n成绩表里没有学生成绩,无法执行求平均值操作." << endl;return;}while (p != NULL){sum += p->data;p = p->next;}ave = sum / m_length;cout << "\n学生成绩的平均成绩为:" << ave << endl;cout << "\n";system("pause");system("cls");}template <typename T>void Scores<T>::m_Seq(){cout << "\n排序操作\n" << endl;this->m_Show(); Node<T> *p; T t;for (int i = 1; i < m_length; i++){p = head;while (p->next != NULL){if (p->data > p->next->data){t = p->data;p->data = p->next->data;p->next->data = t;}p = p->next;}}cout << "\n成绩表从小到大排序完毕." << endl;cout << "\n";this->m_Show();system("pause");system("cls");}template <typename T>void Scores<T>::m_Show(){if (head->next == NULL){cout << "\n成绩表里数据为空,显示操作失败!!";return;}Node<T> *p;p = head->next;cout << "\n成绩表中所有学生成绩为:" << endl;while (p != NULL){cout << p->data << setw(8);p = p->next;}cout << endl;cout << "\n\n";}

//link_main.cpp#include "link_scores.h"#include <iostream>using namespace std;int main(){Scores<int> sco;sco.m_Init();sco.m_Insert();sco.m_Find_Val();sco.m_Find_Loc();sco.m_Del();sco.m_Ave();sco.m_Seq();sco.m_Destroy();return 0;}

实验结果:
















程序尚有不足,待补充待完善。



0 0
原创粉丝点击