现在的位置: 首页 > 综合 > 正文

(数据结构)用线性表实现班级成绩管理的程序

2014年03月07日 ⁄ 综合 ⁄ 共 5586字 ⁄ 字号 评论关闭

用线性表实现班级成绩管理的程序,我用C++实现的,但是用面向过程的方式写的,有很多缺点,望大家指正并相互学习!

运行结果截图:

程序源码:

main.cpp

#include <iostream>
#include <string>
#include "LinkList.h"
using namespace std;
#define ARRAYSIZE 4

int main()
{
    LinkList list[ARRAYSIZE];//存放每个班级的链表头指针
    int number,totalClass;
    Student student;
    ///忘记初始化造成了问题,所以做最好在声明时初始化
    LinkList totalGradeInfo;//整个年级的同学的链表头指针;

    cout << "Please enter the number of the class: ";
    cin >> totalClass;
    if(totalClass > 4)//限定输入的班级数目
    {
        cout << "\nSorry! We can maximum support 4 class's managment!" << endl;
        totalClass = 4;
    }

    for(int i=0; i<totalClass; i++)
    {
        if(!InitList(&list[i]))//如果初始化链表不成功
        {
            cerr << "\nERROR in InitList() when attemp to apply more memory!" << endl;
            for(int j=0; j<i; j++)//free the memory to system!
            {
                DestoryList(&list[j]);//退出程序之前一定销毁链表
            }

            exit(1);
        }

        cout << "\n-------------------------------------------------------" << endl;
        cout << "Please enter the student number of class " << i+1 << ": ";
        cin >> number;
        if(number > 30)//限定每个班级的人数
        {
            cout << "\nSorry! We can maximum support 30 student in one class!" << endl;;
        }

        //start add node
        for(int j=0; j<number; j++)
        {
            cout << "\nPlease enter your classID: ";
            cin >> student.classID;
            cout << "Please enter your studentID: ";
            cin >> student.studentID;
            cout << "Please enter your name: ";
            cin >> student.name;
            cout << "Please enter your score: ";
            cin >> student.score;
            if(student.score < 0 || student.score > 100 )//处理输入成绩不合法的情况
            {
                cout << "\nThe score is unavailable!";
                student.score = 0;
            }

            AddNode(&list[i], student);//添加节点
        }
        SortList(&list[i]);//每个班级添加完成之后排序
        ShowInformation(&list[i], "Class");//输出班级成绩信息
    }

    //合并整个年级的成绩情况
    InitList(&totalGradeInfo);
    CombineLists(list, totalClass, &totalGradeInfo);
    SortList(&totalGradeInfo);
    ShowInformation(&totalGradeInfo, "Total Grade");

    cout << "\n-------------------------------------------------------" << endl;
    for(int i=0; i<totalClass; i++)//free the memory to system!
    {
        DestoryList(&list[i]);//退出程序之前销毁链表
    }

    if(totalGradeInfo.pHead->next != NULL)//销毁合并之后的链表
    {///为什么上一条语句用 ->就会出错?
        DestoryList(&totalGradeInfo);
    }

    return 0;
}

LinkList.h

#ifndef LINKLIST_H_INCLUDED
#define LINKLIST_H_INCLUDED

#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;

typedef struct Student
{
    int classID;
    long studentID;
    string name;
    int score;
}Student;

typedef struct LinkNode
{
    Student data;
    LinkNode *next;
}LinkNode;

typedef struct LinkList
{
    LinkNode *pHead;
    int length;
}LinkList;

bool InitList(LinkList *list);
bool AddNode(LinkList *list, Student e);
bool SortList(LinkList *list);
bool CombineLists(LinkList list[], int arrayLen, LinkList *destList);
bool ShowInformation(LinkList *list, string info);
bool ClearList(LinkList *list);
bool DestoryList(LinkList *list);


#endif // LINKLIST_H_INCLUDED

LinkList.cpp

#include "LinkList.h"

bool InitList(LinkList *list)//初始化链表
{
    if(!(list->pHead=new LinkNode))
    {
        cout << "No free memory!";
        return false;
    }

    list->pHead->next = NULL;
//    list->pHead.data->classID = "";
//    list->pHead->data->name = "";
//    list->pHead->data->score = 0;
//    list->pHead->data->studentID;
    list->length = 0;
    return true;
}

bool AddNode(LinkList *list, Student e)//头插法,添加节点
{
    if(list->pHead==NULL)//如果给定的链表不存在,返回
    {
        cout << "\nThe list don't exist!" << endl;
        return false;
    }
    LinkNode *node = new LinkNode;
    //LinkNode *node = (LinkNode*)malloc(sizeof(LinkNode));
    if(node == NULL)
    {
        cout << "\nDon't have more memory to add element!" << endl;
        return false;
    }

    node->data.classID = e.classID;
    node->data.studentID = e.studentID;
    node->data.name = e.name;
    node->data.score = e.score;

    list->length++;
    node->next = list->pHead->next;
    list->pHead->next = node;
    return true;
}

bool SortList(LinkList *list)//排序链表,需要两个循环多次遍历
{
    if(list->pHead->next==NULL)
    {
        cerr << "\nThe list can't sort in result of the list don't exits or empty!" << endl;
        return false;
    }

    LinkNode *src,*srcNext;
    src = list->pHead->next;

    while(src->next != NULL)
    {
        ///曾经在此处出错,程序语句的顺序十分重要
        srcNext = src->next;//要排序的指针的下一个,以方便比较
        while(srcNext != NULL)
        {
            if(src->data.score < srcNext->data.score)//按照降序方式排列
            {
                Student temp;//交换两个数据
                temp.classID = srcNext->data.classID;
                temp.studentID = srcNext->data.studentID;
                temp.name = srcNext->data.name;
                temp.score = srcNext->data.score;

                srcNext->data.classID = src->data.classID;
                srcNext->data.studentID = src->data.studentID;
                srcNext->data.name = src->data.name;
                srcNext->data.score = src->data.score;

                src->data.classID = temp.classID;
                src->data.studentID = temp.studentID;
                src->data.name = temp.name;
                src->data.score = temp.score;
            }
            srcNext = srcNext->next;
        }
        src = src->next;

    }
    return true;
}

bool CombineLists(LinkList list[], int arrayLen, LinkList *destList)
{
    if(arrayLen == 0)//如果传入的链表数组长度为空,错误,返回
    {
        cerr << "\nERROR in CombineLists()! Those lists you want to combine don't exist!" << endl;
        return false;
    }

    int i = 0;
    LinkNode *temp;//声明一个临时指针变量,遍历访问每条链表
    destList->pHead->next = list[0].pHead->next;

    for(i=1; i<arrayLen; i++)//遍历每一个给定链表数组中的元素,即每一个链表头
    {
        if(list[i].pHead->next != NULL)//如果链表头的指向不为空,表明这个链表不为空
        {
            temp = list[i].pHead->next;
            while(temp->next)//找到链表尾元素,将整个链表加入到已经存在的链表中
            {
                temp = temp->next;
            }

            temp->next = destList->pHead->next;//将当前链表插入到目标链表中
            destList->pHead->next = list[i].pHead->next;
        }

    }

    return true;
}

bool ShowInformation(LinkList *list, string info)//显示链表元素
{
    if(list->pHead==NULL || list->pHead->next == NULL)
    {
        cout << "\nThe link list is empty or don't exist!" << endl;
        return false;
    }

    LinkNode *temp = list->pHead->next;
    cout << "----------------------------------------------";
    if(info == "Total Grade")//如果是总成绩
    {
        cout << "-----";
    }
    cout << "\nThis "<< info << " Information:" << endl;
    while(temp != NULL)
    {
        cout << temp->data.classID << "\t" << temp->data.studentID << "\t" << temp->data.name
             << "\t" << temp->data.score << endl;
        temp = temp->next;
    }
    cout << endl;
    return true;
}

bool ClearList(LinkList *link)//清空链表
{
    if(link->pHead == NULL)
    {
        cerr << "\nERROR! The list don't exist!" << endl;
        return false;
    }
    if(link->pHead->next == NULL)
    {
        cout << "The list is empty already!" << endl;
        return true;
    }

    LinkNode *temp = link->pHead->next;
    while(temp)
    {
        link->pHead->next = temp->next;
        delete temp;
        temp = link->pHead->next;
    }

    if(link->pHead->next == NULL)
    {
        cout << "The list has been cleard!" << endl;
    }

    return true;
}

bool DestoryList(LinkList *list)
{
    if(!ClearList(list))
    {
        return false;
    }

    delete list->pHead;
    cout << "The list has been destoryed!" << endl;
    return true;
}

抱歉!评论已关闭.