数据结构 | 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;
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2019-03-23 11:36  心碎人俱乐部  阅读(19)  评论(0)    收藏  举报