数据结构 第二章 线性表 英语成绩表的单链表实现

一、数据类型的定义

struct Escore            //定义结构体存放学生信息
{
	string name;
	string num;
	float score;
	Escore * next;
};

class ScoreLink
{
public:
	ScoreLink();                  //无参构造函数,创建一个空表
	ScoreLink(Escore a[], int n); //有参构造函数
	~ScoreLink();                 //析构函数
	void Input(Escore x);         //在表末输入学生信息
	Escore Get(int i);            //返回第i个学生信息
	void Delete(int i);           //删除第i个学生信息
	int LocateName(string x);     //按姓名返回学生序号
	int LocateNum(string x);      //按学号返回学生序号
	int LocateScore(float x);     //按分数返回学生序号
	void PrintList();             //按序号依次输出各元素
private:
	Escore * first;               //单链表的头指针
};


二、C++代码段

头文件ScoreLink.h

#include <string>        //引入字符串处理学生姓名和学号
#ifndef ScoreLink_H      //避免重复包含ScoreLink.h头文件
#define ScoreLink_H

struct Escore            //定义结构体存放学生信息
{
	string name;
	string num;
	float score;
	Escore * next;
};

class ScoreLink
{
public:
	ScoreLink();                  //无参构造函数,创建一个空表
	ScoreLink(Escore a[], int n); //有参构造函数
	~ScoreLink();                 //析构函数
	void Input(Escore x);         //在表末输入学生信息
	Escore Get(int i);            //返回第i个学生信息
	void Delete(int i);           //删除第i个学生信息
	int LocateName(string x);     //按姓名返回学生序号
	int LocateNum(string x);      //按学号返回学生序号
	int LocateScore(float x);     //按分数返回学生序号
	void PrintList();             //按序号依次输出各元素
private:
	Escore * first;               //单链表的头指针
};
#endif

源码文件ScoreLink.cpp

#include <iostream>
using namespace std;
#include "ScoreLink.h"

ScoreLink::ScoreLink()
{
	first = new Escore;
	first->next = NULL;
}

ScoreLink::ScoreLink(Escore a[], int n)
{
	Escore *r, *s;
	first = new Escore;
	r = first;
	for (int i = 0; i < n; i++)
	{
		s = new Escore;
		s->name = a[i].name;
		s->num = a[i].num;
		s->score = a[i].score;
		r -> next = s;
		r = s;
	}
	r->next = NULL;
}

ScoreLink::~ScoreLink()
{
	Escore *q = NULL;
	while (first!=NULL)
	{
		q = first;
		first = first->next;
		delete q;
	}
}

//在表末输入学生信息
void ScoreLink::Input(Escore x)
{
	Escore *p = first, *s = NULL;
	while (p->next!=NULL)
	{
		p = p->next;
	}
	s = new Escore;
	s->name = x.name;
	s->num = x.num;
	s->score = x.score;
	p->next = s;
	s->next = NULL;
}

// 查找序号为i的学生信息
Escore ScoreLink::Get(int i)
{
	Escore *p=first;
	int count=0;
	while (p!=NULL)
	{
		p = p->next;
		count++;
	}
	if (i<1 && i>count)
		throw"查找位置非法";
	else
	{
		p = first;
		while (i != 0)
		{
			p = p->next;
			i--;
		}
		return *p;
	}
}

// 查找姓名等于x的元素
int ScoreLink::LocateName(string x)
{
	Escore *p = first->next;
	int i=1;
	while (p != NULL)
	{
		if (p->name == x)
		{
			return i;
			break;
		}
		else
		{
			p = p->next;
			i++;
		}
	}
}


// 查找学号等于x的元素
int ScoreLink::LocateNum(string x)
{
	Escore *p = first->next;
	int i = 1;
	while (p != NULL)
	{
		if (p->num == x)
		{
			return i;
			break;
		}
		else
		{
			p = p->next;
			i++;
		}
	}
}


// 查找英语成绩等于x的元素
int ScoreLink::LocateScore(float x)
{
	Escore *p = first->next;
	int i = 1;
	while (p != NULL)
	{
		if (p->score == x)
		{
			return i;
			break;
		}
		else
		{
			p = p->next;
			i++;
		}
	}
}

// 删除元素
void ScoreLink::Delete(int i)
{
	Escore *p = first, *q = NULL;
	int count = 0;
	while (p!=NULL&&count<i-1)
	{
		p = p->next;
		count++;
	}
	if (p == NULL || p->next == NULL)
		throw"位置";
	else
	{
		q = p->next;
		p->next = q->next;
		delete q;
	}
}


// 按序号依次输出英语成绩表中的元素
void ScoreLink::PrintList()
{
	Escore *p = first->next;
	while (p != NULL)
	{
		cout << "学生姓名:" << p->name << " 学号:" << p->num << " 英语成绩:" << p->score << endl;
		p = p->next;
	}
}

源码文件ScoreSeq_main.cpp

#include <iostream>
using namespace std;
#include "ScoreLink.h"

void main()
{
	Escore a[3],temp;
	int i;
	a[0].name = "Zhangsan";
	a[0].num = "201311672299";
	a[0].score = 99;
	a[1].name = "Lisi";
	a[1].num = "201311672298";
	a[1].score = 98;
	a[2].name = "Wangwu";
	a[2].num = "201311672297";
	a[2].score = 97;
	ScoreLink L(a, 3);                                                    //使用有参构造函数初始化一个长度为3的英语成绩表
	cout << "执行输入操作前英语成绩表为:" << endl;
	L.PrintList();
	
	cout << "请输入学生的姓名  学号  英语成绩" << endl;                  //输入操作
	cin >> temp.name >> temp.num >> temp.score;
	L.Input(temp);
	
	cout << "执行输入操作后英语成绩表为:" << endl;                      //验证输入操作
	L.PrintList();
	
	cout << "请输入需要查找的学生的姓名:" << endl;                      //按值查找
	cin >> temp.name;
	cout << "该学生的序号为:" << L.LocateName(temp.name) << endl;
	cout << "请输入需要查找学生的学号" << endl;
	cin >> temp.num;
	cout << "该学生的序号为:" << L.LocateNum(temp.num) << endl;
	cout << "请输入需要查找学生的成绩" << endl;
	cin >> temp.score;
	cout << "该学生的序号为:" << L.LocateScore(temp.score) << endl;
	
	cout << "请输入需要查找的学生的序号" << endl;                          //按位查找
	cin >> i;
	cout << "该生的姓名:" << L.Get(i).name << " 该生的学号:" << L.Get(i).num << " 该生的英语成绩:" << L.Get(i).score << endl;
	
	cout << "请输入需要删除的学生信息的序号" << endl;                      //删除操作
	cin >> i;
	
	cout << "删除前的成绩表为" << endl;                                    //验证删除操作
	L.PrintList();
	L.Delete(i);
	cout << "删除后的成绩表为" << endl;
	L.PrintList();
}

三、运行结果

控制台运行结果



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值