鱼C论坛

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

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

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

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

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

x
  1. #ifndef LIST_H_
  2. #define LIST_H_
  3. #include <fstream>
  4. using namespace std;
  5. class Node //节点类
  6. {
  7. private:
  8.         char* name;//姓名
  9.         int id;//学号
  10.         float score;//分数
  11.         Node* next;//指向下一个节点
  12. public:
  13.         Node(char*,int,float);
  14.         ~Node();
  15.         void setScore(float);//重新设置分数
  16.         char* getName();//获取分数
  17.         int getId();//获取学号
  18.         float getScore();//获取分数
  19.         Node* getNext();//获取下一个节点地址
  20.         void setNext(Node*);//添加下一个节点地址至前一个节点next

  21. };
  22. class LinkList//链表类
  23. {
  24. private:
  25.         Node* head;
  26. public:
  27.         LinkList();
  28.         LinkList(char*,int,float);
  29.         void addDate(char*,int,float);//增加节点
  30.         ~LinkList();
  31.         void display();//输出链表值
  32.         Node* getHead(); //获取头指针
  33.         void serch(int);//通过学号查找
  34.         void serch(char*);//通过姓名查找
  35.         void changScore();//修改分数
  36.         void passAndGood();//判断及格和优秀人数
  37.         void redData();//从文件读取数据
  38. };[code]#include "List.h"
  39. #include <fstream>
  40. #include <string>
  41. #include <iomanip>
  42. #include <iostream>
  43. using namespace std;
  44. int main()
  45. {        char name[10];
  46.         LinkList *linklist = NULL ;
  47.         char opinion;
  48.         while(1)
  49.         {

  50.                 cout << setw(30) << setfill('*') << '*'<< endl;
  51.                 cout << "学生成绩管理系统" << endl;
  52.                 cout << setw(30) << setfill('*') << '*' << endl;
  53.                 cout << setw(30) << setfill('*') << '*' << endl;
  54.                 cout << std::left << setw(30) << "**1--输入数据" << setfill('*') << endl;
  55.                 cout << std::left << setw(30) << "**2--查询成绩" << setfill('*') << endl;
  56.                 cout << std::left << setw(30) << "**3--修改成绩" << setfill('*') << endl;
  57.                 cout << std::left << setw(30) << "**4--输出所有学生成绩" << setfill('*') << endl;
  58.                 cout << std::left << setw(30) << "**5--统计及格和优秀人数" << setfill('*') << endl;
  59.                 cout << std::left << setw(30) << "**6--退出系统" << setfill('*') << endl;
  60.                 cout << setw(30) << setfill('*') << '*'<< endl;
  61.                 cin >> opinion ;
  62.                 switch(opinion)
  63.                 {
  64.                         case '1':
  65.                                 linklist->redData();
  66.                                 break;
  67.                         case '2':
  68.                                 cout << "请输入查询方式 \n1-通过学号查询\n2-通过姓名查询" << endl;
  69.                                 cin >> opinion;
  70.                                 switch(opinion)
  71.                                 {
  72.                                 case '1':
  73.                                         cout << "请输入学号!" << endl;
  74.                                         cin >> opinion;
  75.                                         linklist->serch(opinion);
  76.                                         break;
  77.                                 case '2':
  78.                                         cout << "请输入姓名!" << endl;
  79.                                         cin >> name;
  80.                                         linklist->serch(name);
  81.                                         break;
  82.                                 }
  83.                                 break;
  84.                         case '3':
  85.                                 linklist->changScore();
  86.                                 break;
  87.                         case '4':
  88.                                 linklist->display();
  89.                                 break;
  90.                         case '5':
  91.                                 linklist->passAndGood();
  92.                                 break;
  93.                         case '6' :
  94.                                 break;
  95.                 }
  96.                 if(opinion=='6')
  97.                         break;
  98.         }
  99.         return 0;
  100. }
复制代码

#endif[/code]
  1. #include "List.h"
  2. #include <iostream>
  3. using namespace std;
  4. Node::Node(char* _name,int _id,float _score)
  5. {
  6.         name = _name;
  7.         id = _id;
  8.         score = _score;
  9.         next = NULL;
  10. }
  11. Node::~Node()
  12. {
  13.         cout << "使用~Node析构函数" << endl;
  14. }
  15. void Node::setScore(float _score)
  16. {
  17.         score = _score;
  18. }
  19. char* Node::getName()
  20. {
  21.         return name;
  22. }
  23. int Node::getId()
  24. {
  25.         return id;
  26. }
  27. float Node::getScore()
  28. {
  29.         return score;
  30. }
  31. Node* Node::getNext()
  32. {
  33.         return next;
  34. }
  35. void Node::setNext(Node *_node)
  36. {
  37.         next = _node; //将一个新的节点插入到链表尾,配合LinkList::addData()使用
  38. }
  39. LinkList::LinkList()
  40. {
  41.         head = NULL;
  42. }
  43. LinkList::LinkList(char* _name,int _id,float _score)
  44. {
  45.         head =new Node(_name,_id,_score); //设置新节点的值,并且将头指针head指向新添加的节点
  46. }
  47. void LinkList::addDate(char* _name,int _id,float _score)
  48. {
  49.         Node* p = head;//初始化一个Node型指针指向头指针head
  50.         if(head==NULL)//判断head是否为空,即链表是否为空链表
  51.         {
  52.                 head = new Node(_name,_id,_score);//若链表为空,创建新节点,并将头指针head指向新的节点
  53.         }
  54.         else//链表不为空
  55.         {
  56.                 while(p->getNext()!=NULL)        //遍历链表直至尾节点
  57.                 {
  58.                         p = p->getNext();               
  59.                 }
  60.                 p->setNext(new Node(_name,_id,_score));//在尾节点后添加新的节点
  61.         }
  62. }
  63. LinkList::~LinkList()
  64. {
  65.                 cout << "使用~LinkList析构函数" << endl;
  66. }
  67. void LinkList::display()//显示函数
  68. {
  69.         ofstream out;
  70.         out.open("Student.txt");
  71.         if(!out)
  72.         {
  73.                 cout << "文件打开失败" << endl;
  74.         }
  75.         else
  76.         {
  77.                 Node* p = head;
  78.                 if(p==NULL)//链表为空的情况(我发现的一个大大的BUG,嘻嘻!)
  79.                 {
  80.                         out << "空链表!" << endl;
  81.                 }
  82.                 else
  83.                 {
  84.                         {        //输出头节点
  85.                                 out << "学号   姓名           成绩" << endl;
  86.                                 out << p->getId() << p->getName() << p->getScore() << endl;
  87.                         }
  88.                         if(p->getNext()!=NULL)//判断下一节点是否为空,并依次输出
  89.                         {       
  90.                                 p = p->getNext();//节点后移
  91.                                 out << p->getId() << p->getName() << p->getScore() << endl;
  92.        
  93.                         }
  94.                 }
  95.         }
  96.        
  97. }
  98. void LinkList::serch(int n)//查找函数,通过学号查找
  99. {
  100.         Node* p = head;//head;获取头指针就会内存报错
  101.         if(p == NULL)
  102.         {
  103.                 cout << "数据为空,查询失败!" << endl;
  104.         }
  105.         else
  106.         {
  107.                 if(p->getId()==n)
  108.                 {
  109.                         cout << p->getId() << p->getName() <<p->getScore() << endl;
  110.                 }
  111.                 else
  112.                 {
  113.                         if(p->getNext()==NULL)
  114.                         {
  115.                                 cout << "查询失败,不存在该学生!" << endl;
  116.                         }
  117.                         else
  118.                         {
  119.                                 if(p->getId()==n)
  120.                                 {
  121.                                         cout << p->getId() << p->getName() <<p->getScore() << endl;
  122.                                 }
  123.                                 p = p->getNext();
  124.                                
  125.                         }
  126.                 }
  127.         }
  128. }
  129. void LinkList::serch(char* n)//查找函数,通过姓名查找
  130. {
  131.         Node* p = head;//获取头指针就会内存报错
  132.         if(p == NULL)
  133.         {
  134.                 cout << "数据为空,查询失败!" << endl;
  135.         }
  136.         else
  137.         {
  138.                 if(p->getName()==n)
  139.                 {
  140.                         cout << p->getId() << p->getName() <<p->getScore() << endl;
  141.                 }
  142.                 else
  143.                 {
  144.                         if(p->getNext()==NULL)
  145.                         {
  146.                                 cout << "查询失败,不存在该学生!" << endl;
  147.                         }
  148.                         else
  149.                         {
  150.                                 if(p->getName()==n)
  151.                                 {
  152.                                         cout << p->getId() << p->getName() <<p->getScore() << endl;
  153.                                 }
  154.                                 p = p->getNext();
  155.                                
  156.                         }
  157.                 }
  158.         }
  159. }
  160. void LinkList::changScore()//分数修改函数
  161. {
  162.         Node* p = head;//获取头指针就会内存报错
  163.         char admin[6] ="admin";
  164.         int  password = 123456;
  165.         char admin1[6] = {0};
  166.         int  password1 = 0;
  167.         cout << "温馨提示,你正在修改数据,请谨慎操作!" << endl;
  168.         cout << "本系统具有超强防护功能,需要验明真身,以供下步操作!" << endl;
  169.         cout << "请按程序提示操作!";
  170.         cout << "请输入用户名" << endl;
  171.         cin >> admin1;
  172.         if(admin==admin1)
  173.         {
  174.                 cout << "请输入密码" << endl;
  175.                 cin >> password1;
  176.                 if(password == password1)
  177.                 {
  178.                         cout << "欢迎使用成绩修改系统" << endl;
  179.                         cout << "请输入需要修改的学生学号" << endl;
  180.                         cin >> password1;
  181.                         if(p  == NULL)
  182.                         {
  183.                                 cout << "非常抱歉,当前数据为空,无法提供更改,请确保数据正常!" << endl;
  184.                         }
  185.                         else
  186.                         {
  187.                                 if(p->getId()==password1)
  188.                                 {
  189.                                         p->setScore(password1);
  190.                                 }
  191.                                 else
  192.                                 {
  193.                                         while(p->getNext()!=NULL)
  194.                                         {       
  195.                                                 p = p->getNext();
  196.                                                 if(p->getId()==password1)
  197.                                                 {
  198.                                                         p->setScore(password1);
  199.                                                 }

  200.                                                
  201.                                         }
  202.                                 }
  203.                         }

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

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

  224.                         cout << q->getId() << q->getName() << q->getScore();
  225.                         if(q->getScore()>=90)
  226.                         {
  227.                                 cout << "优秀" << endl;
  228.                         }
  229.                 }
  230.                 while(q->getNext()!=NULL)
  231.                 {
  232.                         q = q->getNext();
  233.                         if(q->getScore()>=60)
  234.                         {
  235.                                 cout << q->getId() << q->getName() << q->getScore() << endl;
  236.                                 if(q->getScore()>=90)
  237.                                 {
  238.                                         cout << "优秀" << endl;
  239.                                 }
  240.                         }
  241.                 }
  242.         }

  243. }
  244. void LinkList::redData()
  245. {
  246.         char name[10];
  247.         float score;
  248.         ifstream in;
  249.         in.open("Data.txt");
  250.         if(!in)
  251.         {
  252.                 cout << "文件打开失败" << endl;
  253.         }
  254.         else
  255.         {
  256.                 for (int i = 0;i < 5;i++)
  257.                 {
  258.                         in >> name >> score;
  259.                         head = new Node(name,i+1,score);
  260.                 }
  261.         }
  262.         in.close();
  263. }
复制代码

运行错误,求帮助!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-7-19 13:29:58 From FishC Mobile | 显示全部楼层
不懂c++,对不起了楼主
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-8-4 22:33:20 | 显示全部楼层
错误提示是什么。。。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-20 15:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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