鱼C论坛

 找回密码
 立即注册
查看: 1332|回复: 2

c++课程设计之坑爹链表!

[复制链接]
发表于 2015-7-16 10:43:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#ifndef LIST_H_
#define LIST_H_
#include <fstream>
using namespace std;
class Node //节点类
{
private:
        char* name;//姓名
        int id;//学号
        float score;//分数
        Node* next;//指向下一个节点
public:
        Node(char*,int,float);
        ~Node();
        void setScore(float);//重新设置分数
        char* getName();//获取分数
        int getId();//获取学号
        float getScore();//获取分数
        Node* getNext();//获取下一个节点地址
        void setNext(Node*);//添加下一个节点地址至前一个节点next

};
class LinkList//链表类
{
private:
        Node* head;
public:
        LinkList();
        LinkList(char*,int,float);
        void addDate(char*,int,float);//增加节点
        ~LinkList();
        void display();//输出链表值
        Node* getHead(); //获取头指针
        void serch(int);//通过学号查找
        void serch(char*);//通过姓名查找
        void changScore();//修改分数
        void passAndGood();//判断及格和优秀人数
        void redData();//从文件读取数据
};[code]#include "List.h"
#include <fstream>
#include <string>
#include <iomanip>
#include <iostream>
using namespace std;
int main()
{        char name[10];
        LinkList *linklist = NULL ;
        char opinion;
        while(1)
        {

                cout << setw(30) << setfill('*') << '*'<< endl;
                cout << "学生成绩管理系统" << endl;
                cout << setw(30) << setfill('*') << '*' << endl;
                cout << setw(30) << setfill('*') << '*' << endl;
                cout << std::left << setw(30) << "**1--输入数据" << setfill('*') << endl;
                cout << std::left << setw(30) << "**2--查询成绩" << setfill('*') << endl;
                cout << std::left << setw(30) << "**3--修改成绩" << setfill('*') << endl;
                cout << std::left << setw(30) << "**4--输出所有学生成绩" << setfill('*') << endl;
                cout << std::left << setw(30) << "**5--统计及格和优秀人数" << setfill('*') << endl;
                cout << std::left << setw(30) << "**6--退出系统" << setfill('*') << endl;
                cout << setw(30) << setfill('*') << '*'<< endl;
                cin >> opinion ;
                switch(opinion)
                {
                        case '1':
                                linklist->redData();
                                break;
                        case '2':
                                cout << "请输入查询方式 \n1-通过学号查询\n2-通过姓名查询" << endl;
                                cin >> opinion;
                                switch(opinion)
                                {
                                case '1':
                                        cout << "请输入学号!" << endl;
                                        cin >> opinion;
                                        linklist->serch(opinion);
                                        break;
                                case '2':
                                        cout << "请输入姓名!" << endl;
                                        cin >> name;
                                        linklist->serch(name);
                                        break;
                                }
                                break;
                        case '3':
                                linklist->changScore();
                                break;
                        case '4':
                                linklist->display();
                                break;
                        case '5':
                                linklist->passAndGood();
                                break;
                        case '6' :
                                break;
                }
                if(opinion=='6')
                        break;
        }
        return 0;
}
#endif[/code]
#include "List.h"
#include <iostream>
using namespace std;
Node::Node(char* _name,int _id,float _score)
{
        name = _name;
        id = _id;
        score = _score;
        next = NULL;
}
Node::~Node()
{
        cout << "使用~Node析构函数" << endl;
}
void Node::setScore(float _score)
{
        score = _score;
}
char* Node::getName()
{
        return name;
}
int Node::getId()
{
        return id;
}
float Node::getScore()
{
        return score;
}
Node* Node::getNext()
{
        return next;
}
void Node::setNext(Node *_node)
{
        next = _node; //将一个新的节点插入到链表尾,配合LinkList::addData()使用
}
LinkList::LinkList()
{
        head = NULL;
}
LinkList::LinkList(char* _name,int _id,float _score)
{
        head =new Node(_name,_id,_score); //设置新节点的值,并且将头指针head指向新添加的节点
}
void LinkList::addDate(char* _name,int _id,float _score)
{
        Node* p = head;//初始化一个Node型指针指向头指针head
        if(head==NULL)//判断head是否为空,即链表是否为空链表
        {
                head = new Node(_name,_id,_score);//若链表为空,创建新节点,并将头指针head指向新的节点
        }
        else//链表不为空
        {
                while(p->getNext()!=NULL)        //遍历链表直至尾节点
                {
                        p = p->getNext();                
                }
                p->setNext(new Node(_name,_id,_score));//在尾节点后添加新的节点
        }
}
LinkList::~LinkList()
{
                cout << "使用~LinkList析构函数" << endl;
}
void LinkList::display()//显示函数
{
        ofstream out;
        out.open("Student.txt");
        if(!out)
        {
                cout << "文件打开失败" << endl;
        }
        else
        {
                Node* p = head;
                if(p==NULL)//链表为空的情况(我发现的一个大大的BUG,嘻嘻!)
                {
                        out << "空链表!" << endl;
                }
                else
                {
                        {        //输出头节点
                                out << "学号   姓名           成绩" << endl;
                                out << p->getId() << p->getName() << p->getScore() << endl;
                        }
                        if(p->getNext()!=NULL)//判断下一节点是否为空,并依次输出
                        {        
                                p = p->getNext();//节点后移
                                out << p->getId() << p->getName() << p->getScore() << endl;
        
                        }
                }
        }
        
}
void LinkList::serch(int n)//查找函数,通过学号查找
{
        Node* p = head;//head;获取头指针就会内存报错
        if(p == NULL)
        {
                cout << "数据为空,查询失败!" << endl;
        }
        else
        {
                if(p->getId()==n)
                {
                        cout << p->getId() << p->getName() <<p->getScore() << endl;
                }
                else
                {
                        if(p->getNext()==NULL)
                        {
                                cout << "查询失败,不存在该学生!" << endl;
                        }
                        else
                        {
                                if(p->getId()==n)
                                {
                                        cout << p->getId() << p->getName() <<p->getScore() << endl;
                                }
                                p = p->getNext();
                                
                        }
                }
        }
}
void LinkList::serch(char* n)//查找函数,通过姓名查找
{
        Node* p = head;//获取头指针就会内存报错
        if(p == NULL)
        {
                cout << "数据为空,查询失败!" << endl;
        }
        else
        {
                if(p->getName()==n)
                {
                        cout << p->getId() << p->getName() <<p->getScore() << endl;
                }
                else
                {
                        if(p->getNext()==NULL)
                        {
                                cout << "查询失败,不存在该学生!" << endl;
                        }
                        else
                        {
                                if(p->getName()==n)
                                {
                                        cout << p->getId() << p->getName() <<p->getScore() << endl;
                                }
                                p = p->getNext();
                                
                        }
                }
        }
}
void LinkList::changScore()//分数修改函数
{
        Node* p = head;//获取头指针就会内存报错
        char admin[6] ="admin";
        int  password = 123456;
        char admin1[6] = {0};
        int  password1 = 0;
        cout << "温馨提示,你正在修改数据,请谨慎操作!" << endl;
        cout << "本系统具有超强防护功能,需要验明真身,以供下步操作!" << endl;
        cout << "请按程序提示操作!";
        cout << "请输入用户名" << endl;
        cin >> admin1;
        if(admin==admin1)
        {
                cout << "请输入密码" << endl;
                cin >> password1;
                if(password == password1)
                {
                        cout << "欢迎使用成绩修改系统" << endl;
                        cout << "请输入需要修改的学生学号" << endl;
                        cin >> password1;
                        if(p  == NULL)
                        {
                                cout << "非常抱歉,当前数据为空,无法提供更改,请确保数据正常!" << endl;
                        }
                        else
                        {
                                if(p->getId()==password1)
                                {
                                        p->setScore(password1);
                                }
                                else
                                {
                                        while(p->getNext()!=NULL)
                                        {        
                                                p = p->getNext();
                                                if(p->getId()==password1)
                                                {
                                                        p->setScore(password1);
                                                }

                                                
                                        }
                                }
                        }

                }
        }
        else
        {
                cout << "用户名输入错误" << endl;
                cout << "本系统具有超强防护功能,为防止暴力破解!请重启后重试!" << endl;
        }

}
void LinkList::passAndGood()
{
        Node* q = head;//获取头指针就会内存报错
        if(head==NULL)
        {
                cout << "数据为空,无法提供统计功能!" << endl;
        }
        else        
        cout << "及格人数如下:" << endl;
        {
                if(q->getScore()>=60)
                {

                        cout << q->getId() << q->getName() << q->getScore();
                        if(q->getScore()>=90)
                        {
                                cout << "优秀" << endl;
                        }
                }
                while(q->getNext()!=NULL)
                {
                        q = q->getNext();
                        if(q->getScore()>=60)
                        {
                                cout << q->getId() << q->getName() << q->getScore() << endl;
                                if(q->getScore()>=90)
                                {
                                        cout << "优秀" << endl;
                                }
                        }
                }
        }

}
void LinkList::redData()
{
        char name[10];
        float score;
        ifstream in;
        in.open("Data.txt");
        if(!in)
        {
                cout << "文件打开失败" << endl;
        }
        else
        {
                for (int i = 0;i < 5;i++)
                {
                        in >> name >> score;
                        head = new Node(name,i+1,score);
                }
        }
        in.close();
}
运行错误,求帮助!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-7-19 13:29:58 From FishC Mobile | 显示全部楼层
不懂c++,对不起了楼主
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-8-4 22:33:20 | 显示全部楼层
错误提示是什么。。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-26 05:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表