回 帖 发 新 帖 刷新版面

主题:[讨论]请大虾帮我分析一下程序那里错了

创建一个学生链表,输入数据时按学生的分数从小到大排序储存。  

#include<iostream>
using namespace std;
//...................定义结构......................
struct student
{
    char name[10];
    int score;
    student *next;
};
void charu(student *head,student *sample);       //.........声明插入列表函数。
void shuchu(student *head);
//...................创建列表.......................
void create(student *head)
{
    student *p2;
    int i=1;
    while(1)
    {
        cout<<"请输入第"<<i<<"位学生的名字:";
        cin>>head->name;
        cout<<"请输入该学生的分数:";
        cin>>head->score;
        if(head->score>=0&&head->score<=100)
            break;
    }
    while(1)
    {
        i++;
         p2=new student;
        p2->next=NULL;
        cout<<"请输入第"<<i<<"位学生的名字:";
        cin>>p2->name;
        cout<<"请输入该学生的分数:";
        cin>>p2->score;
        if(p2->score<0||p2->score>100)
            break;
        else
            charu(head,p2);    //  ............调用插入列表函数
        //shuchu(head);
    }
}
//..........................定义插入列表函数(从小到大排列)......................
void charu(student *head,student *sample)
{
    student *p1,*p2;
    p1=head;
    if(p1->next==NULL)                 //当列表只有1个学生数据时
    {
        if(p1->score>sample->score)   //当表头的学生分数比插入的学生分数大时,插入的数据放在前面
        {        
            sample->next=head;
            //shuchu(sample);
            //cout<<endl;
            head=sample;
            //cout<<5<<endl;
            shuchu(head);
        }
        else
            p1->next=sample;          //当表头的学生分数比插入的学生分数小时,插入的数据放在后面
    }
    else
    {
        int count=0;
        while(p1->score<sample->score)
        {
            if(p1->next==NULL)        //当链表中的所有学生的分数都比插入的学生分数小时,
            {
                p1->next=sample;      //插入的学生数据放在链表后.
                break;
            }
            count=1;
            p2=p1;
            p1=p1->next;
        }
        if(count==1&&p1->next!=sample) //插入在列表中。
        {
            p2->next=sample;
            sample->next=p1;
        }
        else if(count==0&&head->next!=sample)//当插入的学生分数比表头学生分数大时,放在链表头。
        {
            sample->next=head;
            head=sample;
            //shuchu(head);
            //cout<<"********"<<endl;
        }
    }
}
//.........................输出列表........................
void shuchu(student *head)
{
    student *p1;
    p1=head;
    while(p1!=NULL)
    {
        cout<<"   学生"<<p1->name<<"的分数为:"<<p1->score<<endl;
        p1=p1->next;
    }
}
int main()
{
    student *xuesheng;
    xuesheng=new student;
    xuesheng->next=NULL;
    create(xuesheng);
    shuchu(xuesheng);
    return 0;
}

哪位大虾帮我分析下哪里错了, 为什么?

回复列表 (共3个回复)

沙发

根据你的思路,我写了一个程序,但是有个缺陷:程序没有对第一个结点排序,对后来输入的结点都排序了(升序)。因此第一个数据输入时要取最小值,VC6.0编译通过,希望对你有所帮助。
// t082301.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
using namespace std;

typedef struct Student
{
    char name [10];
    char score[10];
    Student * next;
}Stu;

Stu * CreatLink  ( Stu *head );
Stu * InsertValue( Stu *head, Stu *student );
void  PrintLink  ( Stu *head);
int   count = 0; //全局变量用来记录结点数目

int main(int argc, char* argv[])
{
    Stu *head  = ( Stu * )malloc( sizeof( Stu ) );
    head->next = NULL;
    count     += 1;      //创建一个新结点,结点数加1
    Stu *root  = ( Stu * )malloc( sizeof( Stu ) );
    root       = CreatLink( head );
    if ( root->next != NULL )
    {
        cout<<"---------------"<<endl;
        PrintLink( root );
    }
    free( root );
    return 0;
}

Stu * CreatLink( Stu *head )
{
    char name [10], score[10];
    Stu *student = ( Stu * )malloc( sizeof( Stu ) );
    student->next= NULL;
    Stu *root    = ( Stu * )malloc( sizeof( Stu ) );
    root         = head;
    while ( true )
    {
        cout<<"输入学生的姓名:"<<endl;
        gets( name );
        if ( 0 == strcmp( name, "exit" ) )  //输入exit则退出
        {
            break;
        }
        cout<<"输入学生的成绩:"<<endl;
        gets( score );
        if ( 0 == strcmp( score, "exit" ) )
        {
            break;
        }

        if (1 == count)  //对头结点赋值
        {
            strcpy( root->name,  name);
            strcpy( root->score, score);
        }
        if ( count > 1)  //对新建立的结点赋值并插入
        {
            strcpy( student->name,  name);
            strcpy( student->score, score);
            root=InsertValue( head, student);
        }
        Stu *student  = ( Stu * )malloc( sizeof( Stu ) );
        student->next = NULL;
        count        += 1; 
    }
    return root;
}

Stu * InsertValue(Stu *head, Stu *student)
{
    Stu *root = head;
    Stu *pend = root;           //每次都从头开始遍历
    Stu *pos  = ( Stu * )malloc( sizeof( Stu ) );
    if (pend->next == NULL)      //只有头结点时
    {
        pos   =  head;
    }

          //从头开始寻找比前面分数要大的插入点
    while ( strcmp(student->score, pend->score) >= 0 )      
    {
        pos  = pend;
        pend = pend->next;
        if ( pend == NULL )
        {
            break;
        }
    }
    
    if (pos->next == NULL)  //插入点后无其它元素
    {
        Stu * NewNode = ( Stu * )malloc( sizeof( Stu ) );
        strcpy(NewNode->name, student->name);
        strcpy(NewNode->score, student->score);
        pos->next     = NewNode;
        NewNode->next = NULL;
        pend          = NewNode;
    }
    else //插入点后有其它元素
    {
        Stu * NewNode = ( Stu * )malloc( sizeof( Stu ) );
        strcpy(NewNode->name,  student->name);
        strcpy(NewNode->score, student->score);
        NewNode->next = pos->next;
        pos->next     = NewNode;
    }
    return root;
}

void PrintLink( Stu *root )
{
    cout<<"姓名"<<" 成绩"<<endl;
    while ( root != NULL )
    {
        cout<<root->name<<"  "<<root->score<<endl;
        root = root->next;
    }
}

板凳


我觉得总体的思路:
1、首先建立一个链表,存储学生的信息;
2、再写一个排序函数,将链表中的数据进行排序即可。

3 楼

你好.我是全职网赚工作者.
如果你有时间有电脑.
想在网络上创业.请联系我..
项目绝对真实.详情QQ空间资料
加盟请联系 QQ908889846

我来回复

您尚未登录,请登录后再回复。点此登录或注册