您的位置:首页 > 理论基础 > 数据结构算法

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

2014-10-19 21:46 519 查看
一、数据类型的定义

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();
}


三、运行结果

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: