| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 721 人关注过本帖
标题:c语言高手们帮忙解答一下~
只看楼主 加入收藏
Gundamgw
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2009-8-17
结帖率:0
收藏
已结贴  问题点数:100 回复次数:9 
c语言高手们帮忙解答一下~
设有N名学生,N由键盘输入,他们可以根据自己的实际情况选修不相同的课程(设课程总数M=3)。要求:
1)    为每门课程建立一个选课链表,并在显示器上显示每个链表生成的过程;
2)    链表结点顺序按学号从小到大排列,当有学生选课时,链表做插入操作,当有学生不选该课程时,链表做删除操作,并要在显示器上显示这些操作过程。
   
   提示:学生类型定义如下:
struct student{
   char xh[5];    /*学号*/
   char name[20]; /*姓名*/
   char  cname[10]; /*课程名*/
   int   grade;   /*成绩*/
   struct node  *link; /*指针,指示出选修的课程及成绩链表*/
)stud_info[N];
搜索更多相关主题的帖子: c语言 指针 
2009-08-17 16:14
UserYuH
Rank: 12Rank: 12Rank: 12
来 自:毅华
等 级:火箭侠
威 望:8
帖 子:720
专家分:3300
注 册:2009-8-10
收藏
得分:33 
有动手编过吗?有就放代码上来让大家看看你哪错了,
没有就看精华贴里的《提问的智慧(望新手借鉴)》。

努力—前进—变老—退休—入土
2009-08-17 16:23
soler
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:181
专家分:1077
注 册:2005-7-16
收藏
得分:33 
回复 2楼 UserYuH帮我看看吧,调试的时候能显示链表上的三个结点,但是运行的时候就只能显示一个,没搞懂。。。
程序代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct student
{
    long stuID;
    char name[20];
    char course[10];
    float grade;
    struct student *next;
};
typedef struct student stu;

stu *creatlist();
stu *insertlist(stu *p,stu *head);
void display(stu *head);

int main()
{
    int num;//学生总数
    printf("pls enter the total number of students:\n");
    scanf("%d",&num);

    stu *head1,*head2,*head3;
    head1=creatlist();
    head2=creatlist();
    head3=creatlist();//定义头结点。

    stu *p;//将要插入到链表的结点定义。
    char *course1="math",*course2="english",*course3="physics";
    while(num--)
    {
        p=(stu *)malloc(sizeof(stu));//创建新的结点。。。
        printf("pls enter your student ID,then choose the course name:\n");
        printf("name    student ID    course\n");
        scanf("%s%ld%s",p->name,&p->stuID,p->course);
        p->next=NULL;

        if(!strcmp(p->course,course1))
            head1=insertlist(p,head1);//先判断是哪门课程。head1对应math链表,head2对应english链表,head3对应physics链表
        if(!strcmp(p->course,course2))
            head2=insertlist(p,head2);
        if(!strcmp(p->course,course3))
            head3=insertlist(p,head3);
    }
    if(head1->next!=NULL)//如果链表后面有结点,显示结点内容,如果没有,删除链表。
        display(head1);
    else free(head1);
    if(head2->next!=NULL)
        display(head2);
    else free(head2);
    if(head3->next!=NULL)
        display(head3);
    else free(head3);

    return 0;
}

stu *creatlist()//创建链表头
{
    stu *head;
    head=(stu *)malloc(sizeof(stu));
    if(head!=NULL)
        head->next=NULL;
    else
    {
        printf("creat list head failed!\n");
        exit(1);
    }
    return head;
}

stu *insertlist(stu *p,stu *head)
{
    stu *pf,*pb;//pf上一个结点,pb当前结点。
    pb=head;
    if(pb->next==NULL)
        head->next=p;//当前结点为头结点
    else
    {
            while(pb!=NULL&&p->stuID>=pb->stuID)//给结点p按学号从小到大顺序安插到合适位置。
            {
                pf=pb;
                pb=pb->next;
            }
            if(pb!=NULL)
            {
                pf->next=p;
                p->next=pb;
            }//把结点p插入链表。
            else
                pf->next=p;//p插入到链表最后。
    }

    return head;
}

void display(stu *head)
{
    head=head->next;//头结点为空,指向第一个结点。
    while(head!=NULL)
        {
            printf("\n%s\t%ld   %s",head->name,head->stuID,head->course);
            head=head->next;
        }
}


[ 本帖最后由 soler 于 2009-8-17 19:51 编辑 ]
2009-08-17 18:49
UserYuH
Rank: 12Rank: 12Rank: 12
来 自:毅华
等 级:火箭侠
威 望:8
帖 子:720
专家分:3300
注 册:2009-8-10
收藏
得分:0 
改好了可以运行,因为时间关系没有注释,你研究一下。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
struct student
{
    long stuID;
    char name[20];
    char course[10];
    float grade;
    struct student *next;
};
typedef struct student stu;
 
stu *creatlist();
stu *insertlist(stu *p,stu *head);
void display(stu *head);
 
int main()
{
    int num;
    stu *head1,*head2,*head3;
    stu *p;
    char *course1="math",*course2="english",*course3="physics";
    printf("pls enter the total number of students:\n");
    scanf("%d",&num);
 
 
    head1=creatlist();
    head2=creatlist();
    head3=creatlist();
 
 
 
    while(num--)
    {
    p=(stu *)malloc(sizeof(stu));
        printf("pls enter your student ID,then choose the course name:\n");
        printf("name    student ID    course\n");
        scanf("%s%ld%s",p->name,&p->stuID,p->course);
        p->next=NULL;
 
        if(!strcmp(p->course,course1))
        head1=insertlist(p,head1);
        if(!strcmp(p->course,course2))
            head2=insertlist(p,head2);
        if(!strcmp(p->course,course3))
            head3=insertlist(p,head3);
    }
    if(head1->stuID!=0)
        display(head1);
    else free(head1);
    if(head2->stuID!=0)
        display(head2);
    else free(head2);
    if(head3->stuID!=0)
        display(head3);
    else free(head3);
 
    return 0;
}
 
stu *creatlist()
{
    stu *head;
    head=(stu *)malloc(sizeof(stu));
    if(head!=NULL)
       {
    head->next=NULL;
    head->stuID=0;
       }
    else
    {
        printf("creat list head failed!\n");
        exit(1);
    }
    return head;
}
 
stu *insertlist(stu *p,stu *head)
{
    stu *pf,*pb,*t;
    pb=head;
    pf=head;
    if(pb->next==NULL&&pb->stuID==0)
       {
     head=p;
    head->next=NULL;
       }
    else
    {
        t=pf;
        while(pb!=NULL&&p->stuID>=pb->stuID)
            {
        pf=t;
        t=pb;
        pb=pb->next;
            }
        if(t==head&&p->stuID<=head->stuID)
        {
        p->next=head;
        head=p;
 
         
        }
        else
          if(t->next==NULL&&p->stuID>=t->stuID)
           {
        pf->next=p;
        p->next=NULL;
           }
          else
           {
                pf->next=p;
        p->next=pb;
           }
    }
 
    return head;
}
 
void display(stu *head)
{
    while(head!=NULL)
        {
            printf("\n%s\t%ld   %s",head->name,head->stuID,head->course);
            head=head->next;
        }
}

努力—前进—变老—退休—入土
2009-08-18 01:35
soler
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:181
专家分:1077
注 册:2005-7-16
收藏
得分:0 
回复 4楼 UserYuH
还是不对,输入3个数据,还是有一个不能显示出来。
2009-08-18 02:12
godbless
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:216
专家分:950
注 册:2009-7-24
收藏
得分:33 
回复 3楼 soler

链表插入函数有问题,看看下面的.

stu *insertlist(stu *p,stu *head)
{
    stu *pf,*pb;//pf上一个结点,pb当前结点。
    pb=head;                             //改为pb=head->next;pf=head;      
    if(pb->next==NULL)                   //改为if(pb==NULL)
        head->next=p;//当前结点为头结点
    else
    {
            while(pb!=NULL&&p->stuID>=pb->stuID)//给结点p按学号从小到大顺序安插到合适位置。

//因为你如果不改上面的两句,运行到这里的时候,一开始你的pb=head,这个时候pb->stuID==head->stuID是头结点是没有赋值的,因此无法参与后面的比较,出现问题..

            {
                pf=pb;
                pb=pb->next;
            }
            if(pb!=NULL)
            {
                pf->next=p;
                p->next=pb;
            }//把结点p插入链表。
            else
                pf->next=p;//p插入到链表最后。
    }
 
    return head;
}
2009-08-18 09:00
soler
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:181
专家分:1077
注 册:2005-7-16
收藏
得分:0 
回复 6楼 godbless
哦,谢谢了,修改后ok,,,
2009-08-18 11:13
UserYuH
Rank: 12Rank: 12Rank: 12
来 自:毅华
等 级:火箭侠
威 望:8
帖 子:720
专家分:3300
注 册:2009-8-10
收藏
得分:0 
你用什么编译器呀,我用TC是通过可行的,
这两天怎么都碰到运行不了的还不对的?

努力—前进—变老—退休—入土
2009-08-18 13:19
soler
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:181
专家分:1077
注 册:2005-7-16
收藏
得分:0 
用的codeblocks。。。。
2009-08-18 14:49
Gundamgw
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2009-8-17
收藏
得分:0 
回复 6楼 godbless
    pb=head;                             //改为pb=head->next;pf=head;     
    if(pb->next==NULL)                   //改为if(pb==NULL)
    改这两句吗?怎么改了还是有问题?
2009-09-02 12:26
快速回复:c语言高手们帮忙解答一下~
数据加载中...
 
   



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

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