| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 470 人关注过本帖
标题:写的链表怎么输入和输出都做不到?求指点求开导
只看楼主 加入收藏
鸿飞冥冥
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:48
专家分:124
注 册:2011-8-14
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:3 
写的链表怎么输入和输出都做不到?求指点求开导
程序代码:
# include <stdio.h>
# include <malloc.h>
# include <stdlib.h>
# include <string.h>

# define NULL 0

int len;      //定义当前已存放的学生个数

struct student
{
    char num[9];
    char name[9];
    float language;
    float math;
    float english;
    float average;
    struct student * next;
};

struct student * input(void);
void output(struct student * );
//struct student * sort(struct student * );
void sinput(struct student * );

int main (void)
{
    int n;
    
    struct student * head = NULL;
    
    do
    {
        system("cls");
        printf("\t主菜单\n");
        printf("================================\n");
        printf("1.输入学生成绩\n");
        printf("2.插入学生成绩\n");
        printf("3.显示成绩优秀的学生成绩\n");
        printf("4.按学生学号查询学生成绩\n");
        printf("5.按学生姓名查询学生成绩\n");
        printf("6.显示所有学生成绩\n");
        printf("0.退出系统\n");
        printf("================================\n");
        printf("请选择(0~6):");
        scanf("%d",&n);
        switch(n)
        {
        case 0:break;
        case 1:system("cls");
            head = input();
            break;
        case 6:system("cls");
            output(head);
            break;
        }
        
    }while(n != 0);
    printf("谢谢使用!\n");
    
    
    
    return 0;
}
//单次输入函数

void sinput(struct student * p1)
{
    printf("请输入学号:");
    scanf("%s",p1->num);
    printf("请输入姓名:");
    scanf("%s",p1->name);
    printf("请输入语文成绩:");
    scanf("%f",&p1->language);
    printf("请输入数学成绩:");
    scanf("%f",&p1->math);
    printf("请输入英语成绩:");
    scanf("%f",&p1->english);
    p1->average = (p1->language+p1->math+p1->english)/3;
    
    system("cls");
    
    printf("您刚输入的学生信息为:\n");
    printf("        学号    姓名    语文    数学    英语    平均分\n");
    printf("%d\t%s\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n",len,p1->num,p1->name,
        p1->language,p1->math,p1->english,p1->average);
    
    return ;
    
}

//学生成绩录入函数
struct student * input(void)
{
    struct student * phead,* p1,*p2;
    char ch = 'y';
    
    len = 1;
    
    p1 = p2 = (struct student *)malloc(sizeof(struct student));
    
    printf("请输入第%d个学生的信息:\n",len);
    
    sinput(p1);
    
    printf("继续输入按任意键或按n退出输入\n");
    scanf(" %c",&ch);
    
    phead = NULL;
    
    while(ch != 'N'&&ch != 'n')
    {
        len++;
        
        if(len == 2)phead = p1;
        
        else p2->next = p1;
        
        p2 = p1;
        
        p1 = (struct student *)malloc(sizeof(struct student));
        
        system("cls");
        
        printf("请输入第%d个学生的信息:\n",len);
        
        sinput(p1);
        
        printf("继续输入按任意键或按n退出输入\n");
        scanf(" %c",&ch);
        
    }    
    
    p2->next=NULL;
    
    //    phead = sort(phead);
    
    system("cls");
    
    printf("\n\n按任意键返回主菜单……");
    getchar();
    getchar();
    
    return phead;
    
}
void output(struct student * phead)
{
    struct student * p1;
    
    int i = 1;
    
    p1 = phead;
    
    
    printf("        学号    姓名    语文    数学    英语    平均分\n");
    
    while(phead != NULL)
    {
        do
        {
            printf("%d\t%s\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n",i,p1->num,p1->name,
                p1->language,p1->math,p1->english,p1->average);
            
            p1 = p1->next;
            
            i++;
        }while(p1 != NULL);
    }
    
    printf("\n\n按任意键返回主菜单……");
    getchar();
    getchar();

    return ;
    
}

2011-10-13 13:25
绿茶盖儿
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:1
帖 子:363
专家分:1852
注 册:2011-9-3
收藏
得分:20 
如果你只输入一个学生的信息,input函数中while循环将不会执行,那么phead=NULL,返回的是NULL
如果你输入两个学生的数据,input函数中只执行了一次while循环,此时phead、p2指向第一个学生数据,但是你必须执行第二次while循环才能使p2->next指向p1,但实际上只执行了一次while循环,p2->next直接指向了NULL
以此类推……
你的input函数需要修改的
2011-10-13 18:11
绿茶盖儿
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:1
帖 子:363
专家分:1852
注 册:2011-9-3
收藏
得分:0 
当你输入三个以上的学生数时,你的链表不仅缺少最后一个结点,而且是没有结尾的,就不详细说了,你自己好好分析分析吧
2011-10-13 18:32
鸿飞冥冥
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:48
专家分:124
注 册:2011-8-14
收藏
得分:0 
回复 2楼 绿茶盖儿
谢谢指点,,下午一直在想这个问题,,想我写的输入函数和书上的除了循环控制不一样别的都一样却出错,,那错误一定是在while语句里面.
只要找到了问题关键,,解决起来还是很快的
程序代码:
struct student * input(void)
{
    struct student * phead,* p1,*p2;
    char ch = 'y';
    
    len = 1;
    
    p1 = p2 = (struct student *)malloc(sizeof(struct student));
    
    printf("请输入第%d个学生的信息:\n",len);
    
    sinput(p1);
    
    printf("继续输入按任意键或按n退出输入\n");
    scanf(" %c",&ch);
    
    phead = NULL;
    
    while(1)//改为循环前部分必定执行
    {
        len++;
        
        if(len == 2)phead = p1;
        
        else p2->next = p1;
        
        p2 = p1;

        if(ch == 'N'||ch == 'n')break;//循环控制设在分配第二个空间前
        
        p1 = (struct student *)malloc(sizeof(struct student));
        
        system("cls");
        
        printf("请输入第%d个学生的信息:\n",len);
        
        sinput(p1);
        
        printf("继续输入按任意键或按n退出输入\n");
        scanf(" %c",&ch);
        
    }    
    
    p2->next=NULL;
    
    //    phead = sort(phead);
    
    system("cls");
    
    printf("\n\n按任意键返回主菜单……");
    getchar();
    getchar();

    return phead;
    
}

Sickcat
2011-10-13 18:36
快速回复:写的链表怎么输入和输出都做不到?求指点求开导
数据加载中...
 
   



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

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