数据结构实验一:顺序表 C++实现

数据结构实验一:顺序表

C++实现

  1. 实验内容要求:

    定义一个包含学生信息(学号,姓名,成绩)的顺序表,使其具有如下功能(参见教材中基本操作):
    (1) 根据指定学生个数,逐个输入学生信息(构建表或产生表);
    (2) 逐个显示学生表中所有学生的相关信息(显示表,即遍历表);
    (3) 根据姓名进行查找,返回此学生的学号和成绩(查找);
    (4) 根据指定的位置可返回相应的学生信息(学号,姓名,成绩)(取值 ); 
    (5) 给定一个学生信息,插入到表中指定的位置(插入); 
    (6) 删除指定位置的学生记录(删除);
    (7) 统计表中学生个数(相当于求表长)。
    
    (1) 定义Student类,表示学生(注:注意=、==、<<、>>的重写);
    (2) 定义SeqList类,表示顺序表,每一功能用一成员函数实现,函数名和参数与教材P22基本操作保持一致;
    (3)在主函数中创建SeqList对象,并对各个功能进行测试。
    (4) 程序要做到界面友好(菜单式界面),在程序运行时用户可以根据相应的提示信息进行操作。
    
  2. 顺序表功能:

    学生类:

    class Student{
    	string name;
    	string number;
    	string score;
    public:
    	Student(string name=" ", string number=" ", string score=" ") {
    		this->name = name;
    		this->name = number;
    		this->score = score;
    	}
    	friend istream& operator >> (istream& in, Student& s) {
    		cin >> s.name >> s.number >> s.score;
    		return in;
    	}
    
    	friend  ostream& operator <<(ostream& out,const Student& s) {
    		cout << s.name <<"  "<< s.number <<"  "<< s.score;
    		return out;
    	}
    
    	bool operator == (const Student & s) {
    		if (this->name == s.name && this->number == s.number && this->score == s.score)
    			return 1;
    		return 0;
    	}
    	string getName() {
    		return this->name;
    	}
    };
    

    顺序表类:

    class SeqList {
    	Student *data;
    	int length;
    public:
    	SeqList();
    	bool deleteList(SeqList& L, int i,Student& s);
    	bool insertList(SeqList& L, int i,Student s);
    	//根据姓名查找
    	int locateItem(SeqList L, string name);
    	//根据位置输出信息
    	Student getItem(SeqList L, int i);
    	//获取长度
    	int getLength();
    	//遍历列表输出
    	void traverseList();
    	~SeqList();
    };
    

    顺序表初始化:

    SeqList::SeqList() {
    	this->data = new Student[MAXSIZE];
    	this->length = 0;
    	if (this->data==NULL)
    	{
    		cout << "分配失败";
    		return ;
    	}
    }
    

    插入数据:

    bool SeqList::insertList(SeqList& L, int i,Student s) {
    	if (i<1||i>L.length+1)
    	{
    		cout << "请输入正确的插入位置:1-"<<L.length+1;
    		return false;
    	}
    	if (L.length>MAXSIZE)
    	{
    		cout << "当前存储空间已满,插入失败";
    		return false;
    	}
    	cout << "请输入姓名,学号,成绩(每输入一项按回车输入下一项):"<<endl;
    	cin >> s;
    	for (int j=L.length;j>=i;j--)
    		L.data[j] = L.data[j - 1];
    	L.data[i - 1] = s;
    	L.length++;
    	return true;
    }
    

    删除数据:

    bool SeqList::deleteList(SeqList& L, int i, Student& s) {
    	if (i<1 || i>L.length || i > MAXSIZE)
    		cout << "删除失败";
    		return false;
    	s = L.data[i - 1];
    	cout << "删除的元素为:"<<s;
    	for (int j = i; j < L.length; j++)
    		L.data[j - 1] = L.data[j];
    	L.length--;
    	return true;
    }
    

    获取顺序表长度:

    int SeqList::getLength() {
    	return length;
    }
    

    根据姓名查找:

    //根据姓名查找
    int SeqList::locateItem(SeqList L, string name) {
    	int i;
    	for (i = 0; i < L.length; i++)
    		if (L.data[i].getName() == name)
    			return i+1;
    	return -1;
    }
    

    遍历顺序表:

    void SeqList::traverseList() {
    	if (this->length == 0)
    		cout << "顺序表为空" << endl;
    	for (int i = 0; i < this->length; i++)
    		cout << this->data[i]<<endl;
    }
    

    根据位置查找相应数据:

    Student SeqList::getItem(SeqList L, int i) {
    	Student s("不存在") ;
    	if (i<1 || i>L.length) {
    		cout << s;
    		return s;
    	}
    	else {
    		return data[i - 1];
    	}	
    }
    

    析构函数释放内存:

    SeqList::~SeqList() {
    	delete[]this->data;
    }
    
  3. 运行

    show函数:

    void show() {
    	cout << "输入以下数字进行相关操作:\n 1:插入数据\n 2:输出顺序表信息\n 3.删除指定位置信息\n 4:查找指定位置信息\n 5:输入姓名查找元素位置\n 6.获取元素个数\n 0退出\n ";
    }
    

    main函数:

    int main() {
    	Student e;
    	SeqList s;
    	show();
    	bool flag = true;
    	while (flag)
    	{
    		int i;
    		cout << "\n请输入相应数字进行操作:" << endl;
    		cin >> i;
    		switch (i)
    		{
    		case 0:
    			flag = false;
    			break;
    		case 1:
    			int j;
    			cout << "请输入插入位置"<<endl;
    			cin >> j;
    			s.insertList(s,j,e);
    			break;
    		case 2:
    			s.traverseList();
    			break;
    		case 3:
    			int k;
    			cout << "请输入要删除的位置" << endl;
    			cin >> k;
    			cout<< s.deleteList(s, k, e);
    			break;
    		case 4:
    			int i;
    			cout << "请输入要查找的位置" << endl;
    			cin >> i;
    			cout<<s.getItem(s,i);
    			break;
    		case 5:
    		{
    			string name;
    			cout << "请输入要查找的姓名" << endl;
    			cin >> name;
    			cout <<"在顺序表的位置:"<< s.locateItem(s, name);
    			break;
    		}
    		case 6:
    			cout<<"顺序表长度为:"<< s.getLength();
    			break;
    		default:
    			cout << "输入错误";
    			break;
    		}
    	}
    	cout << "退出程序";
    	return 0;
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值