课程实践实验五:线性表的实现和应用
问题描述及要求
(1)实现顺序表类及基本操作并进行测试。
(2)实现单链表类及基本操作并进行测试。除基本操作外,为单链表类增加逆置、按值查找、按值统计、删除等(递归及非递归)算法并进行测试。
(3)设计并实现有序单链表类,添加有序表下的按值插入、有序表合并等算法。
(4)利用单链表类,完成日常支出简单管理。
输入n项支出项目(可以选择从文件输入),并依次输出所有支出项目。
求出这n个支出项目中的最小、最大和平均消费。
按照日期找出某一天的所有花费。
按照日期和项目找出该项目花费 。
按照项目找出该项目的所有花费。比如要求给出在shoes这一项上总共花了多少钱。
概要设计
(1)对实验内容的理解和二次概括
使用线性表和链表的定义来实现基本的操作,并通过定义节点的数据结构,来实现日常支出管理。
(2)给出系统的功能列表
顺序表类的基本操作:增,减,清除等
单链表的基本操作
单链表的逆置,按值查找,按值统计,删除等
有序表下的按值插入,有序表合并等算法
日常支出的简单管理
(3)程序运行的界面设计 (可以用图示等方式,如:首先出现屏幕提示,请用户选择输入配置的方式,1从键盘输入活单元坐标2……3….然后用户)
(4)确定总体设计思路,采用何种数据结构,设计哪些类,各类的作用 ,类方法的介绍,类之间的关系描述
采用顺序表和单链表的数据结构,设计一个顺序表类,一个单链表类,再针对日常支出的简单管理设计一个单链表类,每个类有基本的操作方法:size, empty, clear, full, reverse, retrieve, replace, remove, insert
详细设计
单链表的逆置:void reverse();
从头结点开始,使指针p指向头节点,再使第一个头结点的next指向第三个节点,第二个节点的next指向头结点,这样就完成了前两个节点的顺序交换,然后让head指向第二个节点,继续循环,依次交换。
单链表的按值查找:Error_code list<list_entry>::search(const list_entry&x, int &position)
从单链表的头节点开始,依次向后,使用position记录位置,如果出现某一个节点的值与查找的值相等,则记录查找到的position位置。
附代码:
#include <iostream>
#include <ctime>
#include <random>
#include <algorithm>
using namespace std;
enum Error_code
{
success, fail, rangeerror, overflow, underflow, range_over
};
int max_list = 10000;
template <class List_entry>
class List
{
public:
List()
{
count = 0;
}//构造函数
int size() const;
bool full() const;
bool empty() const;
void traverse(void(*visit)(List_entry&));
Error_code retrieve(int position, List_entry& x) const;
Error_code remove(int position, List_entry& x);
Error_code insert(int position, const List_entry& x);
void printout()
{
for (int i = 0; i < count; i++)
{
cout << entry[i] << " ";
}
cout << endl;
}
void ListSort()//顺序表排序
{
for (int i = 0; i < count - 1; ++i)
{
int flag = 0;
for (int j = 0; j < count - i - 1; ++j)
{
if (entry[j]>entry[j + 1])
{
swap(entry[j], entry[j + 1]);
flag = 1;
}
}
if (flag == 0)
break;
}
}
protected: //私有成员数据
int count;
List_entry entry[10000];//所谓contiguous是指采用数组方式存储
};
template <class List_entry>
int List <List_entry>::size(