数据结构 | C++ | 线性表的基本操作
重写一遍代码,温故而知新.结点类型全部是"训练笔记"类,为以后做准备.
数据套格式函数void MakeData(ListNode data),应用在main()里而非.h头文件里.
在头文件里,数据以节点结构体ListNode 的形式在各个函数中传递、流通. 在main()调用时套个壳子,显示出来.
1.顺序表的头文件:
//结点类
struct ListNode
{
string ActName; //训练动作的名称
int sets; //组数
int reps; //次数
int weight; //重量
int mood; //训练感受
};
ListNode err = { "null",0,0,0,1 }; //err是返回异常值的ListNode对象,用{ }包裹,直接赋值
//表类
class List
{
public:
List();
~List();
void CreateList(); //定义创建一个顺序表
void MakeData(ListNode data); //数据套格式
void TraverseList(); //遍历顺序表
ListNode GetElemByIndex(); //根据下标查找顺序表中的元素
int GetElemByElem(); //按名字查找值
bool isEmpty(); //判断顺序表是否为空
bool isFull(); //判断顺序表是否满
int GetLength(); //获取顺序表的长度
void InsertList(int n); //向顺序表中插入新数据
void InsertListAtHead(); //在头部插入新数据
void InsertListAtEnd(); //向顺序表的最后插入数据
void DeleteElem(); //删除指定位置的值
void DeleteElemAtElem(); //按值删除元素
private:
ListNode* elem; //头指针
int length; //表长
};
//构造函数
List::List()
{
elem = new ListNode[MAX];
if (!elem) { cerr << "未分配内存"; }
length = 0;
}
//析构函数
List::~List()
{
delete[] elem;
length = 0;
}
//创建函数
void List::CreateList()
{
int n;
p1:cout << "输入表长";
cin >> n;
if (n < MAX)
{
for (int i = 0; i < n; i++)
{
cout << "输入第" << i + 1 << "个动作名称\n";cin>>elem[i].ActName; //添加<string>才能合法cin输入
cout << "输入组数\n";cin >> elem[i].sets;
cout << "输入次数\n"; cin >> elem[i].reps;
cout << "输入质量\n"; cin>> elem[i].weight;
cout << "1 代表极差,5 代表极好\n"; cin >> elem[i].mood;
length++;
cout << endl;
}
}
else
{
cout << "超过初始表长,请重新输入";
system("cls");
goto p1;
}
}
//数据套格式,不要忘记加限定符::
void List::MakeData(ListNode data)
{
cout << data.ActName << "\t" << data.sets << "组" << " × " << data.reps << "次" << "\t" << data.weight << "KG\t";
switch (data.mood)
{
case 1:cout << "Shit"; break;
case 2:cout << "No good"; break;
case 3:cout << "Normal"; break;
case 4:cout << "Fine"; break;
case 5:cout << "Nice"; break;
default:cout << "无效"; break;
}
cout << endl;
}
//遍历顺序表
void List::TraverseList()
{
for (int i = 0; i < length; i++)
{
MakeData(elem[i]);
}
}
//根据下标查找顺序表中的元素
ListNode List::GetElemByIndex()
{
cout << "输入查找数据的下标" << endl;
int i;
cin >> i;
if (i < length) {return elem[i-1];}
else
{
cout << "输入的序号超出范围";
return err;
}
}
//判断顺序表是否为空
bool List::isEmpty()
{
if (length == 0) { return true; }
else
return false;
}
//判断顺序表是否满
bool List::isFull()
{
if (length == MAX){return true;}
else
return false;
}
//获取顺序表的长度
int List::GetLength()
{
return length;
}
//查看顺序表中是否含有查找的值
int List::GetElemByElem()
{
cout << "按值查找,输入训练名称" << endl;
string name;
cin >> name;
for (int i = 0; i < length; i++)
{
if (elem[i].ActName ==name)
{
cout << "查找成功" << endl;
MakeData(elem[i]);
return i;
}
}
cout << "无查找值\n";
return -1; //return的值用于被其他函数调用,cout语句用于被main()调用
}
//向顺序表中特定位置插入新数据
void List::InsertList(int n)
{
if (n<0||n > length - 1) { cout << "输入位置有误"; }
else if (n > MAX) { cout << "表已满"; }
else
{
for (int i = length - 1; i >= n; i--)
{
elem[i + 1] = elem[i];
}
cout << "训练动作:"; cin >> elem[n].ActName; cout << endl;
cout << "训练组数:"; cin >> elem[n].sets; cout << endl;
cout << "每组次数:"; cin >> elem[n].reps; cout << endl;
cout << "训练重量:"; cin >> elem[n].weight; cout << endl;
cout << "训练感受:"; cin >> elem[n].mood; cout << endl;
}
length++;
}
//在头部插入新数据
void List::InsertListAtHead()
{
cout << "在头部插入元素";
InsertList(0);
}
//向顺序表的最后插入数据
void List::InsertListAtEnd()
{
cout << "在尾部插入元素";
cout << "训练动作:"; cin >> elem[length].ActName; cout << endl;
cout << "训练组数:"; cin >> elem[length].sets; cout << endl;
cout << "每组次数:"; cin >> elem[length].reps; cout << endl;
cout << "训练重量:"; cin >> elem[length].weight; cout << endl;
cout << "训练感受:"; cin >> elem[length].mood; cout << endl;
length++;
}
//删除指定位置的值
void List::DeleteElem()
{
cout << "输入删除元素的序号(从0开始)";
int i;
cin >> i;
if (i<0 || i>length - 1) { cout << "error!"; }
else
{
for (int j = i; j < length - 1; j++)//从指定位置->倒数第二个值
{
elem[j] = elem[j + 1];
}
length--;//有了这一句,遍历时就不会访问到最后一个元素
}
}
//按值删除元素
void List::DeleteElemAtElem()
{
cout << "输入删除元素的名称";
string name;
cin >> name;
for (int i = 0; i < length; i++)
{
if (elem[i].ActName == name)
{
for (int j = i; j < length - 1; j++)//从指定位置->倒数第二个值
{
elem[j] = elem[j + 1];
}
length--;
}
else
{
cout << "无查找值\n";
}
}
}
2.测试的main() 函数
//题目是"训练笔记"
using namespace std;
#include <iostream>
#include<string>
const int MAX = 100;
#include"LIst.h"
int main()
{
List L1;
L1.CreateList();
L1.TraverseList();
//按址查值,得到数据后套格式
L1.MakeData(L1.GetElemByIndex());
//按值查址
L1.GetElemByElem();
//插入新值
cout << "输入新数据的位置"; int i; cin >> i;
L1.InsertList(i-1);
L1.TraverseList();
//表头插值
L1.InsertListAtHead();
L1.TraverseList();
//表尾插值
L1.InsertListAtEnd();
L1.TraverseList();
//删除指定值
L1.DeleteElem();
L1.TraverseList();
//按址删除
L1.DeleteElem();
L1.TraverseList();
//按值删除
L1.DeleteElemAtElem();
L1.TraverseList();
system("pause");
return 0;
}

浙公网安备 33010602011771号