| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 427 人关注过本帖
标题:关于循环链表问题,求高手修改下
只看楼主 加入收藏
cjiao724
Rank: 1
来 自:四川广安
等 级:新手上路
帖 子:2
专家分:0
注 册:2010-10-24
结帖率:0
收藏
已结贴  问题点数:20 回复次数:3 
关于循环链表问题,求高手修改下
/*利用链式存储结构存储学生的成绩信息,设计一个学生成绩管理系统,具有以下功能:
(1)定义学生结构体类型struct Student,每个学生包括学号、姓名、3门功课(课程名自己定义)、总分。
(2)建立单向循环链表:输入若干学生的信息(当输入学生的学号为"end"时结束,要求自动计算总分),
并按输入的顺序建立单向循环链表;
(3)输出学生成绩信息:遍历单向循环链表,输出所有学生的完整信息到屏幕;
(4)查找指定学号的学生信息。如果查找成功,输出所有学生信息,否则输出失败。
(5)插入学生信息:将新的学生成绩信息插入到指定位置;
(6)删除学生信息:给出学生姓名,删除链表所有相同姓名的学生的信息(即姓名相同的结点);
(7)修改学生信息:给出学生学号,修改该生的三门课程成绩信息;
(8)按总分排序:在原来的单向循环链基础上按总分降序进行就地排列。即不能增加额外的空间开销*/
#include<iostream>
using namespace std;

typedef struct Student{
    int number;
    char name[20];
    double c1;
    double c2;
    double c3;
    double total;
    struct Student *next;
}student,* stt;


void input(student *l);
double to(student *l1);
void show(student *l);
void search(student *l,int n);
void insert(student *l,int nu);
void del(student *l,char na[]);
void reset(student *l);
void paixu(student *l);


void main()
{

    stt l=new student;
    l=l->next;
    input(l);
    show(l);
    int n;
    cout<<"输入查找学号:"<<endl;
    cin>>n;
    search(l,n);
    int nu;
    cout<<"输入插入学号:"<<endl;
    cin>>nu;
    insert(l,nu);
    char na[20];
    cout<<"输入要删除学生姓名:"<<endl;
    cin>>na;
    del(l,na);
    reset(l);
    paixu(l);
}
void input(student *l)
{
    stt l2=l;
    cout<<"请输入学号 姓名 课程1成绩 课程2成绩 课程3成绩 "<<endl;
    do
    {
        stt l1;
        cin>>l1->number>>l1->name>>l1->c1>>l1->c2>>l1->c3;
        if(l1->number==0)
        {
            cout<<"input end!";
            exit(1);
        }   
        l2->next=l1;
        l1->next=l;
        l2=l1;
        cout<<endl;            
    }while(1);
   
}
double to(student *l1)
{
    double t=l1->c1+l1->c2+l1->c3;
    return t;
}
void show(student *l)
{
    stt l1=l;
    cout<<"学号  姓名 课程1成绩 课程2成绩 课程3成绩 总成绩"<<endl;
    do
    {
        cout<<l1->number<<"  "<<l1->name<<"    "<<l1->c1<<"   "<<l1->c2<<"    "<<l1->c3;
        cout<<"  "<<to(l1)<<endl;
        l1=l1->next;
    }while(l1->next!=l);
}
void search(student *l,int n)
{
    int num;
    cout<<"请输入要查找的学号: ";
    cin>>num;
    stt l1=l;
    do
    {
        if(num==l1->number)
        {
            cout<<l1->number<<"  "<<l1->name<<"    "<<l1->c1<<"   "<<l1->c2<<"    "<<l1->c3;
            cout<<"  "<<to(l1)<<endl;
        }
        else{cout<<"查无此人!";exit(1);}
        l1=l1->next;
    }while(l1!=l);
}
void insert(student *l,int nu)
{

    stt l1=l;
    cin>>nu;
    do
    {
        l1=l1->next;
    }while(l1->number!=nu);

    student * x=new student;
    cout<<"学号  姓名 课程1成绩 课程2成绩 课程3成绩 "<<endl;
    cin>>x->number>>x->name>>x->c1>>x->c2>>x->c3;
    x->next=l1->next;
    l1->next=x;
}
        
void del(student *l,char na[])
{
    stt l1=l;
    stt l2=l1;
    do{l2->next=l1;l1=l1->next;}while(l1->name!=na);
    l2->next=l1->next;
}

void reset(student *l)
{
    int num;
    cout<<"输入要修改学生的学号: ";
    cin>>num;
    stt l1=l;
    do
    {
        if(l1->number==num)
        {
            cout<<"课程1成绩 课程2成绩 课程3成绩:";
            cin>>l1->c1>>l1->c2>>l1->c3;
        }
        l1=l1->next;
    }while(l1!=l);
}
        
void paixu(student *l)
{
    stt l1=l->next;
    stt l2=l1->next;
    do
    {
        do
        {
            if(l2->total>l1->total)
            {
                l->total=l1->total;
                l1->total=l2->total;
                l2->total=l->total;
            }
            l2=l2->next;
        }while(l2!=l);
        l1=l1->next;        
    }while(l1->next!=l);
}

输入的时候老是有问题,就是不晓得哪里错了,请高手指点下。感激不尽。
搜索更多相关主题的帖子: 结构体 姓名 
2011-04-21 21:34
诸葛修勤
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:11
帖 子:549
专家分:1955
注 册:2010-10-28
收藏
得分:20 
指针 要分配空间
2011-04-24 20:29
诸葛修勤
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:11
帖 子:549
专家分:1955
注 册:2010-10-28
收藏
得分:0 
程序代码:
#include <iostream>
#include <cstring>
using namespace std;

//定义链表节点
class Student
{
public:
    int number;
    char name[20];
    double c1;
    double c2;
    double c3;
    double total;
    Student * next;

    Student(int m_num=0, char *m_name=NULL, double m_c1=0, double m_c2=0,
        double m_c3=0, Student*m_next=NULL)
    {
        number = m_num;
        if (m_name != NULL)
        {
            strcpy(name, m_name);
        }
        c1 = m_c1;
        c2 = m_c2;
        c3 = m_c3;
        total = c1 + c2 + c3;
        next = m_next;
    }
};

class List
{
public:
    List();//构造函数
    void add_node(int index=1);//在指定的位置插入结点
    void del_node(char *name);//删除具有相同姓名的结点
    void chg_node(int number);//修改学生的成绩信息
    void sor_node();//总分降序进行就地排列
    void show_list();//输出所有的结点信息
    ~List();//析构函数
private:
    Student *list;
};

List::List()
{//初始化头结点
    list = new Student();
    list->next = list;//构成循环
}

void List::add_node(int index)
{//默认的下标是从1开始计算
    Student *temp = list;

    if ( index <= 0 )
    {
        cout << "\t小标输入错误" << endl;
        return;
    }

    while ((--index != 0) && (list != temp->next))
    {
        temp = temp->next;
    }

    if (index == 0)
    {
        temp->next = new Student(0, NULL, 0, 0, 0, temp->next);
    }
    temp = temp->next;

    cout << "输入学号:" ; cin >> temp->number;
    cout << "输入姓名:" ; cin >> temp->name;
    cout << "输入课程1成绩:" ; cin >> temp->c1;
    cout << "输入课程2成绩:" ; cin >> temp->c2;
    cout << "输入课程3成绩:" ; cin >> temp->c3;
    temp->total = temp->c1 + temp->c2 + temp->c3;       
}

void List::show_list()
{
    Student *temp = list->next;

    while (temp != list)
    {
        cout << "学号:" << temp->number << endl;
        cout << "姓名:" << temp->name << endl;
        cout << "课程1成绩:" << temp->c1 << endl;
        cout << "课程2成绩:" << temp->c2 << endl;
        cout << "课程3成绩:" << temp->c3 << endl;
        cout << "总分:" << temp->total << endl << endl;

        temp = temp->next;
    }
}

List::~List()
{
    Student *temp = list->next;
    Student *p = NULL;

    while(temp != list)
    {
        p = temp;
        temp = p->next;
        delete p;
    }

    delete temp;
    list = NULL;
}

void List::chg_node(int number)
{
    Student *temp = list->next;

    while (temp != list)
    {
        if (temp->number == number)
        {
            cout << "输入修改后课程1成绩:" ; cin >> temp->c1;
            cout << "输入修改后课程2成绩:" ; cin >> temp->c2;
            cout << "输入修改后课程3成绩:" ; cin >> temp->c3;
            temp->total = temp->c1 + temp->c2 + temp->c3;
        }

        temp = temp->next;
    }
}

void List::del_node(char *name)
{
    Student *temp = list;
    Student *p = NULL;

    while (temp->next != list)
    {
        p = temp->next;
        if ( strcmp(name, p->name) == 0 )
        {
            temp->next = p->next;
            delete p;
        }
        else
        {
            temp = temp->next;
        }
    }
}

void List::sor_node()
{
    Student *recode = list->next;
    Student *temp = list->next;
    Student *parent = list;
    Student *tp = list;
    Student *flag = NULL;

    while (flag == NULL || flag->next != list)
    {
        if (flag != NULL)
        {
            parent = flag;
            tp = flag;
            recode = flag->next;
            temp = flag->next;
        }
        while (temp != list)
        {
            if (temp->total < recode->total)
            {
                parent = tp;
                recode = temp;
            }
            tp = tp->next;
            temp = temp->next;
        }
        if (flag == NULL)
        {
            flag = recode;
        }
        parent->next = recode->next;
        recode->next = list->next;
        list->next = recode;
    }
}

int main(void)
{
    List list;

    int n = 3;

    while (n--)
    {
        list.add_node();
    }
   
    list.show_list();
   
    list.chg_node(1000);
    list.show_list();

    list.del_node("yxf");
    list.show_list();

    list.sor_node();
    list.show_list();
    return 0;
}
2011-04-24 22:37
wangliqh
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2011-5-8
收藏
得分:0 
厉害
2011-05-08 23:31
快速回复:关于循环链表问题,求高手修改下
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.030379 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved