标题:一个链表问题包含了节点的 插入 删除 自定义函数的输出 有点问题 大家帮帮 ...
只看楼主
吴小杰
Rank: 3Rank: 3
来 自:。。。。。。
等 级:论坛游侠
帖 子:58
专家分:107
注 册:2011-11-11
结帖率:100%
已结贴  问题点数:20 回复次数:12 
一个链表问题包含了节点的 插入 删除 自定义函数的输出 有点问题 大家帮帮忙啊 3q了
1. 创建一个复杂数据(结构体)类型,该类型的变量能够存放一个学生的信息,包括:学号、姓名、性别以及三门课程的成绩(C程序设计、计算机科学导论和大学英语),要求性别用中文“男/女”表示。
2. 新建链表存放以下三个学生的信息(链表的每一个节点存放一个学生的信息,各节点以学号递增的顺序排列):
0764181057    林婷婷    女    87    90    78
0764181058    刘俊伟    男    99    65    56
0764181060    卢京京    女    80    90    96
3. 列出平均分高于80分的学生姓名,学号和平均成绩,如:
林婷婷 0764181057 85.0
4. 向链表中插入一个学生,插入完成后链表保持学号递增顺序不变,该生信息为:
0764181059    戴国锋    男    81    92    89
5. 从链表中删除“计算机科学导论”课程成绩低于70分的学生。
6.编写一个遍历输出该链表全体数据的函数,并在新建、插入、删除等操作后调用以验证程序的正确性。
#include <stdio.h>
#include <malloc.h>
#define LEN sizeof(struct student)
struct student {
    char num[15];
    char name[20];
    char sex[6];
    float score1;
    float score2;
    float score3;
    struct student*next;
};
int main() {
    void print(struct student*head);
    int n = 1;
    struct student *head, *p1, *p2,*p0;// 1     1到2 应该是在for 里面有问题 因为我输入一组数的时候有结果,输入两组的时候
    head = p1 = p2 = (struct student*) malloc(LEN);//就出现一个对话框了***。exe停止工作了
    p1->next = NULL;
    scanf("%s", p1->num);
    scanf("%s %s %f %f %f", p1->name, p1->sex, &p1->score1, &p1->score2,
            &p1->score3);
    for (;;) {
        if (n > 1)
            p2->next = p1;
        p2 = p1;
        n++;
        p1 = (struct student*) malloc(LEN);
        scanf("%s", p1->num);
        int n;
        n = atoi(p1->num);
        if (n == 0)
            break;
        scanf("%s %s %f %f %f", p1->name, p1->sex, &p1->score1, &p1->score2,
                &p1->score3);
    }
   print(head);//(输出开始时的信息)  2   2到3貌似也有问题
   p0=(struct student*) malloc(LEN);
   p0->next=NULL;
   printf("输入插入的学生信息\n");
    scanf("%s %s %s %f %f %f",p0->num, p0->name, p0->sex, &p0->score1, &p0->score2,
                &p0->score3);
    p1=head;
    for(;;p0=p0->next)
    {if(p1->next!=NULL&&p1->num<p0->num&&p1->next->num>p0->num)
        {p0->next=p1->next;
         p1->next=p0;
         break;}
    if(p1->next==NULL&&p1->num<p0->num)
    { p0=p1->next;
       p0->next=NULL;
    break;}
    if(head->num>p0->num)
        {p0->next=head;
        p0=head;
        break;}
    }
    print(head);//输出插入后的信息 3  3到4也是

    for(p2=head,p1=head->next;;p1=p1->next,p2=p2->next)
    {if(head->score2<70)
        head=head->next;
    if(p1->score2<70&&p1->next!=NULL)
        p2->next=p1->next;
    if(p1->score2<70&&p1->next==NULL)
        p2->next=NULL;
    }
    print(head);//(输出删除后的信息) 4

    return 0;
}
void print(struct student*head)//(这个是书上看的 没问题)
{    struct student*p1;
    p1 = head;
    if (p1 != NULL)
        do {
            printf("%s %s %s %.1f %.1f %.1f\n", p1->num, p1->name, p1->sex,
                    p1->score1, p1->score2, p1->score3);
            p1 = p1->next;
        } while (p1 != NULL);
}
搜索更多相关主题的帖子: 信息 姓名 计算机科学 C程序设计 结构体 
2011-12-04 02:50
zy_space
Rank: 5Rank: 5
等 级:职业侠客
帖 子:163
专家分:364
注 册:2011-11-14
得分:7 
看到一堆代码就头大==
我觉得问题应该出在对数据的调用上吧,就是"->"或者"."的用法错误。或者关于内存的创建与释放方面的错误。
仔细检查吧

何必等待?梦在今朝
2011-12-04 05:12
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
得分:7 
回复 楼主
这代码有水平,错误不少,看着很乱,楼主先补上注释,补的时候可以自检一下,看你能检出点错误不

[ 本帖最后由 embed_xuel 于 2011-12-4 07:36 编辑 ]

总有那身价贱的人给作业贴回复完整的代码
2011-12-04 07:34
吴小杰
Rank: 3Rank: 3
来 自:。。。。。。
等 级:论坛游侠
帖 子:58
专家分:107
注 册:2011-11-11
得分:0 
回复 3楼 embed_xuel
看完老谭的书再编的
#include <stdio.h>
#include <malloc.h>
#define LEN sizeof(struct student)
struct student {
    char num[15];
    char name[20];
    char sex[6];
    float score1;
    float score2;
    float score3;
    struct student*next;
};
int main() {
    void print(struct student*head);//1   1到2 没问题了
    int n = 1;
    struct student *head, *p1, *p2,*p0;
    head = p1 = p2 = (struct student*) malloc(LEN);
    p1->next = NULL;//但是这里为什么要加这句呢
    scanf("%s", p1->num);
    scanf("%s %s %f %f %f", p1->name, p1->sex, &p1->score1, &p1->score2,
            &p1->score3);
    for (;;) {
        if (n > 1)
            p2->next = p1;
        p2 = p1;
        n++;
        p1 = (struct student*) malloc(LEN);
        p1->next=NULL;//还有这句   这是我听了他们的建议加的
        scanf("%s", p1->num);
        int a;
        a = atoi(p1->num);
        if (a == 0)
            break;
        scanf("%s %s %f %f %f", p1->name, p1->sex, &p1->score1, &p1->score2,
                &p1->score3);

    }
   print(head);//2
   p0=(struct student*) malloc(LEN);//重新开一个空间给要插入的p0
   printf("输入插入的学生信息\n");
    scanf("%s %s %s %f %f %f",p0->num, p0->name, p0->sex, &p0->score1, &p0->score2,
                &p0->score3);
    p1=head;
    for(;;p0=p0->next)//让p0后移
    {if(p1->next!=NULL&&p1->num<p0->num&&p1->next->num>p0->num)
        {p0->next=p1->next;
         p1->next=p0;
         break;}//插入节点到链表中间
    if(p1->next==NULL&&p1->num<p0->num)
    { p0=p1->next;
       p0->next=NULL;
    break;}//插入节点到链表的尾端
    if(head->num>p0->num)
        {p0->next=head;
        p0=head;
        break;}//头结点
    }
    print(head);

    for(p2=head,p1=head;;p2=p1,p1=p1->next)//3
    {if(head->score2<70)
        head=head->next;//删除头结点
    if(p1->score2<70&&p1->next!=NULL)
        p2->next=p1->next;//删除链表中间的节点
    if(p1->score2<70&&p1->next==NULL)
        p2->next=NULL;//删除最后一个节点
    }
    print(head);

    return 0;
}
void print(struct student*head)//4    这里没问题      void print(struct student*head)这句帮我解释下啊
{    struct student*p1;
    p1 = head;
    if (p1 != NULL)
        do {
            printf("%s %s %s %.1f %.1f %.1f\n", p1->num, p1->name, p1->sex,
                    p1->score1, p1->score2, p1->score3);
            p1 = p1->next;
        } while (p1 != NULL);
}
2011-12-04 09:25
吴小杰
Rank: 3Rank: 3
来 自:。。。。。。
等 级:论坛游侠
帖 子:58
专家分:107
注 册:2011-11-11
得分:0 
回复 2楼 zy_space
哎 第一次编链表啊 真的找不出啊
2011-12-04 09:26
吴小杰
Rank: 3Rank: 3
来 自:。。。。。。
等 级:论坛游侠
帖 子:58
专家分:107
注 册:2011-11-11
得分:0 
大家一起来帮帮忙啊
2011-12-04 12:27
吴小杰
Rank: 3Rank: 3
来 自:。。。。。。
等 级:论坛游侠
帖 子:58
专家分:107
注 册:2011-11-11
得分:0 
大侠们来帮帮忙啊,有点急啊
2011-12-04 16:27
吴小杰
Rank: 3Rank: 3
来 自:。。。。。。
等 级:论坛游侠
帖 子:58
专家分:107
注 册:2011-11-11
得分:0 
大侠们来帮帮忙啊,有点急啊
2011-12-04 20:00
吴小杰
Rank: 3Rank: 3
来 自:。。。。。。
等 级:论坛游侠
帖 子:58
专家分:107
注 册:2011-11-11
得分:0 
#include <stdio.h>
 #include <malloc.h>
 #define LEN sizeof(struct student)
 struct student {
     char num[15];
     char name[20];
     char sex[6];
     float score1;
     float score2;
     float score3;
     struct student*next;
 };
 int main() {
     void print(struct student*head);//1   1到2 没问题了
    int n = 1;
     struct student *head, *p1, *p2,*p0;
     head = p1 = p2 = (struct student*) malloc(LEN);
     p1->next = NULL;//但是这里为什么要加这句呢
     scanf("%s", p1->num);
     scanf("%s %s %f %f %f", p1->name, p1->sex, &p1->score1, &p1->score2,
             &p1->score3);
     for (;;) {
         if (n > 1)
             p2->next = p1;
         p2 = p1;
         n++;
         p1 = (struct student*) malloc(LEN);
         p1->next=NULL;//还有这句   这是我听了他们的建议加的
         scanf("%s", p1->num);
         int a;
         a = atoi(p1->num);
         if (a == 0)
             break;
         scanf("%s %s %f %f %f", p1->name, p1->sex, &p1->score1, &p1->score2,
                 &p1->score3);
 
    }
    print(head);//2
    p0=(struct student*) malloc(LEN);//重新开一个空间给要插入的p0
    printf("输入插入的学生信息\n");
     scanf("%s %s %s %f %f %f",p0->num, p0->name, p0->sex, &p0->score1, &p0->score2,
                 &p0->score3);
     p1=head;
     for(;;p0=p0->next)//让p0后移
     {if(p1->next!=NULL&&p1->num<p0->num&&p1->next->num>p0->num)
         {p0->next=p1->next;
          p1->next=p0;
          break;}//插入节点到链表中间
     if(p1->next==NULL&&p1->num<p0->num)
     { p0=p1->next;
        p0->next=NULL;
     break;}//插入节点到链表的尾端
     if(head->num>p0->num)
         {p0->next=head;
         p0=head;
         break;}//头结点
     }
     print(head);
 
    for(p2=head,p1=head;;p2=p1,p1=p1->next)//3
     {if(head->score2<70)
         head=head->next;//删除头结点
     if(p1->score2<70&&p1->next!=NULL)
         p2->next=p1->next;//删除链表中间的节点
     if(p1->score2<70&&p1->next==NULL)
         p2->next=NULL;//删除最后一个节点
     }
     print(head);
 
    return 0;
 }
 void print(struct student*head)//4    这里没问题      void print(struct student*head)这句帮我解释下啊
 {    struct student*p1;
     p1 = head;
     if (p1 != NULL)
         do {
             printf("%s %s %s %.1f %.1f %.1f\n", p1->num, p1->name, p1->sex,
                     p1->score1, p1->score2, p1->score3);
             p1 = p1->next;
         } while (p1 != NULL);
 }
2011-12-04 20:48
吴小杰
Rank: 3Rank: 3
来 自:。。。。。。
等 级:论坛游侠
帖 子:58
专家分:107
注 册:2011-11-11
得分:0 
大侠们  帮帮忙啊
2011-12-05 10:29



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-356905-1-1.html




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

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