求一份数据结构课程设计报告

时间有点赶,12.3中午前。哪些编程高手帮我编一下吧~~~~~~
一、课程设计内容:
1.用C或C++语言编写一个程序实现学员成绩管理,每个学员包括3门课的成绩,从键盘输入学员信息。
2.学员信息包括学号、姓名、三门课成绩,计算出学员的平均成绩,按照学员平均成绩由大到小排序成绩表保持有序。
3.查找功能:指定学号,从学员信息表中找到该学员信息,并可以该学员的成绩进行修改,修改后(可以保存(到内存或磁盘))。
4.插入功能:在排序后的学员成绩表中插入一个学员的信息,要求插入后仍然保持成绩表有序。
5.删除功能:要求输入指定的学号,从学员信息表中删除该学员,删除后的成绩表保持有序。
6.数据存放在文件中,对数据进行使用时,一次性从文件读入到内存储器中,退出程序时可以将数据存放到磁盘中。〔该功能为可选功能,选做,如果选做该项,则在总成绩(总分100分)基础上视完成情况有0~20分的加分〕
二、问题分析
1.使用结构体或类保存每个学员的信息,包括学号、姓名、三门课的成绩、平均成绩
2.使用结构或对象数组或多链表保存所有学员的信息
3.需要实现以下函数:
3.1单个学员信息的录入;
3.2显示学员信息;
3.3 查找及修改;
3.4排序;(按照平均成绩由大到小)
3.5插入;(插入后保持有序)
3.6删除;(删除后保持有序)
4.在主函数中调用以上函数,分别完成录入、排序、插入和删除功能,并显示排序前后的学员信息,以及插入删除后的学员信息
三、基本功能实现及算法分析
1.数据逻辑结构
本程序的主要数据包括:〔说明程序使用的主要数据内容〕
数据类型定义:〔说明程序使用的主要数据(学生信息)的C或C++语言描述〕
2.程序主界面
程序主界面如下如示:〔请用您的程序主界面替换下图〕
图1 学生成绩管理系统主界面
2.显示学员信息
当选择1后进入学员信息显示界面,界面如图所示:〔将程序截图粘贴到下面〕
图2 学员信息显示界面
主要程序算法:〔将核心代码附在下面,不要全部代码,能说明功能即可〕
算法分析:〔分析该算法的时间复杂度和空间复杂度,讨论其效率和改进意见〕
3.录入学员信息
当选择2后进入录入学员信息界面,界面如图所示:〔将程序截图粘贴到下面〕
图3 录入学员信息界面
主要程序算法:〔将核心代码附在下面,主要是录入后新增结点和查入到正确位置的算法。不要全部代码,能说明功能即可〕
算法分析:〔分析该算法的时间复杂度和空间复杂度,讨论其效率和改进意见〕
4.删除学员信息
当选择3后进入删除学员信息界面,界面如图所示:〔将程序截图粘贴到下面〕
图4删除学员信息界面
主要程序算法:〔将核心代码附在下面,主要是删除学员信息后数组重排或链表重接的算法。不要全部代码,能说明功能即可〕
算法分析:〔分析该算法的时间复杂度和空间复杂度,讨论其效率和改进意见〕
5. 查找及修改学员信息
当选择4后进入删除学员信息界面图5查找学员信息界面
图6修改学员信息界面
主要程序算法:〔将核心代码附在下面,主要是查找学员信息算法。不要全部代码,能说明功能即可〕
算法分析:〔分析该算法的时间复杂度和空间复杂度,讨论其效率和改进意见〕
6. 对学员信息进行排序
当选择5后进入对学员信息进行排序界面:
主要程序算法:〔将核心代码附在下面,主要是排序算法。不要全部代码,能说明功能即可〕
算法分析:〔分析该算法的时间复杂度和空间复杂度,讨论其效率和改进意见〕
八、总结及心得体会
各位高手帮帮忙,拜托啦~~~~~如果能用一定追加分数
因为是要记入期末考试的,所以很重要、很赶。帮帮忙啊,各位~~~~~

第1个回答  2009-12-09
//class CNode.h
#ifndef __CNODE_H__
#define __CNODE_H__

#include <iostream>
using namespace std;
struct stData //出生年月结构
{
int m_nYear;
int m_nMonth;
int m_nDay;
};

struct stResult //五门课成绩结构
{
double m_dSubject_1; //自己改成绩的名称
double m_dSubject_2;
double m_dSubject_3;
double m_dSubject_4;
double m_dSubject_5;
};

struct stStudent //声明学生信息的结构
{
string m_strNumber; //学生学号
string m_strName; //姓名
char m_chSex; //性别
struct stData m_stData; //出生年月
string m_strAppearance; //政治面貌
struct stResult m_stResult; //五门课成绩
};

typedef class CNode
{
private:
struct stStudent m_stStudent;
CNode* m_Next;
public:
CNode(); //构造函数
~CNode(); //析构函数
void SetNodeData(); //设置结点内容的函数成员
stStudent GetNodeData(); //获取结点内容的函数成员
void SetNodeNext(CNode* _Next); //设置结点Next指针的函数成员
void ShowNodeData(); //输出结点内容的函数成员
CNode* GetNodeNext(); //获取结点Next指针的函数成员
}LinkNode;

#endif

//class CLinkList
#ifndef __CLINKLIST_H__
#define __CLINKLIST_H__

#include "CNode.h"

typedef class CLinkList
{
private:
LinkNode* m_Head; //链表的头指针
LinkNode m_Node; //链表的头结点
public:
CLinkList(); //构造函数
~CLinkList(); //析构函数
void CreateList(); //初始化链表的函数成员
LinkNode* GetListNode(int _nIndex); //按位置查找指定位结点的成员函数
void InsertList(int _nIndex); //插入结点的成员函数
void DeleteList(int _nIndex); //删除某一结点的成员函数
LinkNode* GetHeadList(); //获取头指针的成员函数
void SetListData(int _nIndex); //设置链表中某一结点的值的成员函数
void ShowListData(int _nIndex); //这个是现实链表中某一结点值的函数成员
void DestroyList(int _nIndex); //销毁某一位置以后链表的成员函数
void ShowList(); //显示链表的成员函数
}LinkList;

#endif

//class CLinkList

#include "CLinkList.h"
#include "CNode.h"

CLinkList::CLinkList()
{
cout << "这个是构造函数"<< endl;

m_Head = &m_Node; //链表的头指针指向头结点
m_Node.SetNodeNext(NULL); //将头结点的Next指针设置为NULL;
}

CLinkList::~CLinkList()
{
cout << "这个是析构函数" << endl;
}

void CLinkList::CreateList() //以向后追加的方式创建一个链表,输入0退出
{
int nTemp = 0; //定义一个临时变量用于标志程序结束
cout << "欢迎来创建链表 !" << endl;
CNode * pTemp = NULL; //定义一个临时结点指针,用来增加新结点用
CNode * pNode = m_Head; //定义一个标记指针,首先叫其指向头结点

while(1)
{
pTemp = new LinkNode;

cout << "请输入下一个结点的内容!" << endl;
pTemp->SetNodeData(); //设置链表中结点的内容

cout << "如果想继续输入下一个学生的信息请输入 1,否则输入 0" << endl;
cin >> nTemp;
if ('0' == nTemp)
{
break;
}
pNode->SetNodeNext(pTemp); //让链尾的Next指向新建的结点
pNode = pTemp; //将结尾元素向后移
}
cout << "创建链表结束" << endl;
}

LinkNode* CLinkList::GetListNode(int _nIndex)
{
cout << "这个是按位置查找指定位结点的成员函数" << endl;

LinkNode* pNode = m_Head->GetNodeNext(); //定义一个临时的结点指针,初始化指向头结点
int Temp = 0; //定义一个临时的变量,用来标记已检查结点的个数的

if(-1 == _nIndex) //返回头结点(即头指针)
{
return m_Head;
}

if(_nIndex < -1) //_nIndex控制条件
{
cout << "您输入的是错误的位置!" << endl;
return 0;
}

while(pNode != NULL)
{
if(_nIndex == Temp)
{
return pNode;
}
pNode = pNode->GetNodeNext(); //临时结点向后移动
++Temp;
}

return pNode; //没找到结点就返回NULL

}

void CLinkList::ShowListData(int _nIndex);

void CLinkList::InsertList(int _nIndex) //插入结点的函数成员
{
cout << "这个是插入结点的成员函数" << endl;

LinkNode* pNode = GetListNode(_nIndex - 1); //定义一个结点类的指针,指向的是要插入位置的前一指针

LinkNode* pTemp = new CNode; //定义一个临时结点指针,用来增加新结点用

pTemp->SetNodeData(); //设置插入结点的内容

pTemp->SetNodeNext(pNode->GetNodeNext());
pNode->SetNodeNext(pTemp);
}

void CLinkList::DeleteList(int _nIndex)
{
cout << "这个是删除某一结点的成员函数" << endl;

LinkNode* pNode = GetListNode(_nIndex - 1); //定义一个结点类的指针,指向的是要删除位置的前一指针
LinkNode* pTemp = NULL; //定义一个临时结点指针,用来指向要删除的结点

pTemp =pNode->GetNodeNext(); //把pTemp指向要删除的结点

pNode->SetNodeNext(pTemp->GetNodeNext()); //把pNode指向要删除的结点的后一个结点

delete pTemp; //删除结点
pTemp = NULL;
}

LinkNode* CLinkList::GetHeadList()
{
cout << "这个是获取头指针的成员函数" << endl;

return m_Head;
}

void CLinkList::SetListData(int _nIndex)
{
cout << "这个是设置链表中某一结点的值的成员函数" << endl;

CNode *pNode = GetListNode(_nIndex); //定义一个结点类的指针,指向的是要修改内容位置的结点

pNode->SetNodeData(); //修改内容

}

void CLinkList::ShowListData(int _nIndex)
{
cout << "这个是显示链表中某一结点值的成员函数" << endl;

CNode *pNode = GetListNode(_nIndex); //定义一个结点类的指针,指向的是要获取内容位置的结点

pNode->ShowNodeData(); //返回想要得到位置的结点内容
}

void CLinkList::DestroyList(int _nIndex)
{
cout << "这个是销毁某一位置以后链表的成员函数" << endl;

LinkNode* pTemp = GetListNode(_nIndex - 1); //定义一个结点指针,指向要销毁位置的前一结点
LinkNode* pNode = pTemp->GetNodeNext(); //定义一个结点指针,指向要销毁位置的结点

while(pTemp->GetNodeNext() != NULL) //销毁动作的结束条件或初始条件
{
pTemp->SetNodeNext(pNode->GetNodeNext()); //把需要销毁的位置的前结点的Next指向销毁位置的下一个结点
delete pNode; //销毁结点

pNode = pTemp->GetNodeNext(); //把pNode重新指向要销毁位置的结点
}
}

void CLinkList::ShowList()
{
cout << "这个是显示链表的成员函数" << endl;

int nTemp = 0; //定义一个临时的整形变量用来控制输入的个数

LinkNode* pTemp = m_Head->GetNodeNext(); //定义一个结点类指针,指向第0位的结点
if(NULL == pTemp)
{
cout << "这是个空链" << endl;
}

while(pTemp != NULL)
{
pTemp->ShowNodeData();

++nTemp;
if(0 == nTemp % 5 && nTemp != 0) //控制每行只能输出5个结点的内容
{
cout << endl;
}

pTemp = pTemp->GetNodeNext();
}
}

//class CNode
#include "CNode.h"

CNode::CNode() //构造函数
{
//m_stStudent = {0};
m_Next = NULL;
}

CNode::~CNode() //析构函数
{
}

void CNode::SetNodeData()
{
char* pNumber = new char[30]; //用来接收字符串的临时变量
char* pName = new char[30];
char* pAppearance = new char[30];

cout << "学生学号: " << endl;
cin >> pNumber;
m_stStudent.m_strNumber = pNumber;
cout << "姓名: " << endl;
cin >> pName;
m_stStudent.m_strName = pName;
cout << "性别: " << endl;
cin >> m_stStudent.m_chSex;
cout << "出生年月: " << endl;
cout << "m_stData.m_nYear" << endl;
cin >> m_stStudent.m_stData.m_nYear;
cout << "m_stData.m_nMonth" << endl;
cin >> m_stStudent.m_stData.m_nMonth;
cout << "m_stData.m_nDay" << endl;
cin >> m_stStudent.m_stData.m_nDay;
cout << "政治面貌: " << endl;
cin >> pAppearance;
m_stStudent.m_strAppearance = pAppearance;
cout << "五门课成绩: " << endl;
cout << "m_dSubject_1: " << endl;
cin >> m_stStudent.m_stResult.m_dSubject_1;
cout << "m_dSubject_2: " << endl;
cin >> m_stStudent.m_stResult.m_dSubject_2;
cout << "m_dSubject_3: " << endl;
cin >> m_stStudent.m_stResult.m_dSubject_3;
cout << "m_dSubject_4: " << endl;
cin >> m_stStudent.m_stResult.m_dSubject_4;
cout << "m_dSubject_5: " << endl;
cin >> m_stStudent.m_stResult.m_dSubject_5;

delete []pNumber; //释放内存
pNumber = NULL; //指针置空

delete []pName; //释放内存
pName = NULL;

delete []pAppearance; //释放内存
pAppearance = NULL;
}

stStudent CNode::GetNodeData() //返回结点内容(即学生信息)
{
return m_stStudent;
}

void CNode::SetNodeNext(CNode* _Next)
{
m_Next = _Next;
}

void CNode::ShowNodeData()
{
const char* pNumber = m_stStudent.m_strNumber.c_str(); //用来接收字符串的临时变量
const char* pName = m_stStudent.m_strNumber.c_str();
const char* pAppearance = m_stStudent.m_strAppearance.c_str();

cout << "学生学号: " << pNumber << '\t' << "姓名: " << pName << '\t' << "性别: " << m_stStudent.m_chSex;
cout << "出生年月: " << m_stStudent.m_stData.m_nYear << ',' << m_stStudent.m_stData.m_nMonth << ',' << m_stStudent.m_stData.m_nDay;
cout << "政治面貌: " << pAppearance << "五门课成绩: " << endl;
cout << "m_dSubject_1: "<< m_stStudent.m_stResult.m_dSubject_1<< endl;
cout << "m_dSubject_2: "<< m_stStudent.m_stResult.m_dSubject_2<< endl;
cout << "m_dSubject_3: "<< m_stStudent.m_stResult.m_dSubject_3<< endl;
cout << "m_dSubject_4: "<< m_stStudent.m_stResult.m_dSubject_4<< endl;
cout << "m_dSubject_5: "<< m_stStudent.m_stResult.m_dSubject_5<< endl;

}

CNode* CNode::GetNodeNext()
{
return m_Next;
}

#include "CLinkList.h"
#include "CNode.h"

void Text(); //测试函数声明

int main()
{
cout << "这是mian函数" << endl;
Text();
return 0;
}

void Text()
{
cout << "这个是测试函数" << endl;

LinkList* pList = new LinkList; //创建一个内存链表对象

cout << "------------------CreateList-----------------------------" << endl;
pList->CreateList(); //初始化链表的函数成员
pList->ShowList();
cout << endl;

cout << "------------------GetListNode-----------------------------" << endl;
LinkNode* pNode = NULL; //定义一个临时的结点类指针用于检测查找函数成员
pNode = pList->GetListNode(3); //按位置查找指定位结点的成员函数的测试

if(pNode)
{
cout << "用按位置查找的方法找到了指定位结点" << endl;
}
else
{
cout << "对不起,用按位置查找的方没有找到指定位结点" << endl;
}
cout << endl;

cout << "------------------InsertList-----------------------------" << endl;
pList->InsertList(0); //插入结点的成员函数的测试
pList->ShowList();
cout << endl;

cout << "------------------DeleteList-----------------------------" << endl;
pList->DeleteList(0); //删除某一结点的成员函数的测试
pList->ShowList();
cout << endl;

cout << "------------------GetHeadList-----------------------------" << endl;
pNode = NULL;
pNode = pList->GetHeadList(); //获取头指针的成员函数的测试
if(pNode)
{
cout << "已经返回了头指针" << endl;
}
else
{
cout << "对不起,头指针为空" << endl;
}
cout << endl;

cout << "------------------GetHeadList-----------------------------" << endl;
pList->SetListData(3); //设置链表中某一结点的值的成员函数的测试
pList->ShowList();
cout << endl;

cout << "------------------GetListData-----------------------------" << endl;
cout << "pList->ShowListData(3) =";
pList->ShowListData(3); //获取链中某一结点值的成员函数的测试
cout << endl;

cout << "------------------DestroyList(3)-----------------------------" << endl;
pList->DestroyList(3); //销毁第3位置以后链表的成员函数的测试
pList->ShowList();
cout << endl;

cout << "------------------DestroyList(0)-----------------------------" << endl;
pList->DestroyList(0); //销毁第0位置以后链表的成员函数的测试
pList->ShowList();
cout << endl;

delete pList; //释放内存
pList = NULL; //指针置空

}

你的要求太多 , 没仔细看, 我把我给别人写的赋值给你吧 , 我已经写的很全了,程序有问题可以给我留言本回答被提问者采纳
相似回答