| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 624 人关注过本帖
标题:用链表做学生信息管理出现问题
只看楼主 加入收藏
张童
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2015-11-30
结帖率:33.33%
收藏
已结贴  问题点数:20 回复次数:11 
用链表做学生信息管理出现问题
#include <stdio.h>
#include <stdlib.h>
#define LEN sizeof(struct Student)
typedef struct Student
{
   int num;
   char name;
   int score;
   struct Student *next;
} DATE;
int n;
DATE *creat()     /*链表的构建*/
{
    DATE *head;
    DATE *p1,*p2;
    p1=p2=(DATE *)malloc(LEN);
    printf("请输入学生学号  姓名   成绩(按0完成输入)\n");
    scanf("%d %s %d",&p1->num,&p1->name,&p1->score);
    head=NULL;
    while(p1->num!=0)
    {
        n=n+1;
        if(n==1)head=p1;
        else
        {
            p2=p1->next;
            p2=p1;
            p1=(DATE*)malloc(LEN);
            scanf("%d %s %d",&p1->num,&p1->name,&p1->score);
        }

    }
  p2->next=NULL;
  return (head);
}
FILE *fp;
void save(DATE *head)     /*信息的保存*/
{
    DATE *p;
    if((fp=fopen("caonima.dat","w+"))==NULL)
    {
        printf("打开写入文件出错\n");
        fclose(fp);
    }
        while(p!=NULL)
              {
                  fp=fopen("cnm.dat","w+");
                  fprint(fp,"%d %s %d",p->num,p->name,p->score);
                  p=p->next;
              }
        fclose(fp);
}
seek(DATE *head)
{
    DATE *p;
    int n,x;
    char str;
    p=head;
    printf("请选择查找方式:1 or 2(学号 or 姓名):");
    scanf("%d",&n);
    switch(n)
    {
        case 1:
               printf("请输入学号:");
               scanf("%d",&x);
               while(p!=NULL)
               {
                    if(x==p->num)
                    {
                        printf("%d %s %d",p->num,p->name,p->score);
              }
              else
              {
                  printf("请重新输入\n");
                  system("cls");
              }
            p=p->next;                    
               }break;
        case 2:
            printf("请输入姓名:");
            gets(str);
            while(p!=NULL)
            {
                if(str==p->name)
                {
                    printf("%d %s %d",p->num,p->name,p->score);
                }
                else
                {
                    printf("请重新输入:");
                    system("cls");
                }
            }break;
    }
            
}
choose(DATE*head)
{
    DATE *p,*t;
    int w;
    for(p=head;p!=NULL;p=p->next)
    {
        for(t=p->next;t!=NULL;t=t->next)
        {
            if(p->score<t->score)
            {
            w=t->score;
            t->score=p->score;
            p->score=w;
            }
        }
    }
}
print(DATE *head)
{
    DATE *p;
    p=head;
    while(p!=NULL)
    {
        printf("%d %s %d",p->num,p->name,p->score);
        p=p->next;
    }
}
menu()
{
    DATE *pt,head;
    int n;
    char ch;
    printf("************1:录入学生信息\n");
    printf("************2:查找学生信息\n");
    printf("************3:输出学生信息\n");
    printf("***********谢谢使用*******\n");
    scanf("%d",&n);
    system("cls");
    switch(n)
    {
        case 1:
            pt=creat();
            save(pt);
            break;
        case 2:
            seek(head);
            break;
        case 3:
            pt=creat();                        这里怎么让choose这个函数既能引用creat函数的指针,又不让他去运行creat函数去输入数据;
            choose(pt);
            print(pt);                          
            break;                                求大神指点!!!!!!!!!!!!!!!!!!!!!!!
    }
    system("cls");
    getch();
    menu();
}
int main()
{
    menu();
    return 0;
搜索更多相关主题的帖子: include 信息 姓名 
2015-11-30 09:34
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:10 
        case 3:
            pt=(DATE *)malloc(LEN);              //要知道creat做了什么,你不需要输入,那就只需要申请一个DATE空间就是了;
            choose(pt);
            print(pt);                          
            break;   

能编个毛线衣吗?
2015-11-30 09:44
张童
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2015-11-30
收藏
得分:0 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LEN sizeof(struct Student)
typedef struct Student
{
   int num;
   char name;
   int score;
   struct Student *next;
} DATE;
int n;
DATE *creat()     /*链表的构建*/
{
    DATE *head;
    DATE *p1,*p2;
    p1=p2=(DATE *)malloc(LEN);
    printf("请输入学生学号  姓名   成绩(按0完成输入)\n");
    scanf("%d %s %d",&p1->num,&p1->name,&p1->score);
    head=NULL;
    while(p1->num!=0)
    {
        n=n+1;
        if(n==1)head=p1;
        else
        {
            p2=p1->next;
            p2=p1;
            p1=(DATE*)malloc(LEN);
            scanf("%d %s %d",&p1->num,&p1->name,&p1->score);
        }

    }
  p2->next=NULL;
  return (head);
}
FILE *fp;
void save(DATE *head)     /*信息的保存*/
{
    DATE *p;
    if((fp=fopen("caonima.dat","w+"))==NULL)
    {
        printf("打开写入文件出错\n");
        fclose(fp);
    }
        while(p!=NULL)
              {
                  fp=fopen("cnm.dat","w+");
                  fprint(fp,"%d %s %d",p->num,p->name,p->score);
                  p=p->next;
              }
        fclose(fp);
}
void seek(DATE *head)
{
    DATE *p;
    int n,x;
    char str[20];
    p=head;
    printf("请选择查找方式:1 or 2(学号 or 姓名):");
    scanf("%d",&n);
    switch(n)
    {
        case 1:
               printf("请输入学号:");
               scanf("%d",&x);
               while(p!=NULL)
               {
                    if(x==p->num)
                    {
                        printf("%d %s %d",p->num,p->name,p->score);
              }
              else
              {
                  printf("请重新输入\n");
                  system("cls");
              }
            p=p->next;                    
               }break;
        case 2:
            printf("请输入姓名:");
            gets(str);
            while(p!=NULL)
            {
                if(str[20]==p->name)
                {
                    printf("%d %s %d",p->num,p->name,p->score);
                }
                else
                {
                    printf("请重新输入:");
                    system("cls");
                }
            }break;
    }
            
}
void choose(DATE*head)
{
    DATE *p,*t;
    int w;
    t=(DATE*)malloc(LEN);
    for(p=head;p!=NULL;p=p->next)
    {
        for(t=p->next;t!=NULL;t=t->next)
        {
            if(p->score<t->score)
            {
            w=t->score;
            t->score=p->score;
            p->score=w;
            }
        }
    }
}
void print(DATE *head)
{
    DATE *p;
    p=head;
    while(p!=NULL)
    {
        printf("%d %s %d",p->num,p->name,p->score);
        p=p->next;
    }
}
void menu()
{
    DATE *pt,*head;
    int n;
    char ch;
    printf("************1:录入学生信息\n");
    printf("************2:查找学生信息\n");
    printf("************3:输出学生信息\n");
    printf("***********谢谢使用*******\n");
    scanf("%d",&n);
    system("cls");
    switch(n)
    {
        case 1:
            pt=creat();
            save(pt);
            break;
        case 2:

            break;
        case 3:
            pt=(DATE*)malloc(LEN);
            choose(pt);
            print(pt);
            break;
    }
    system("cls");
    getch();
    menu();
}
int main()
{
    menu();     
   return 0;
}                               改了又出现这样的错误,             C:\Users\Administrator\Documents\Tencent Files\daniudream,cpp\collect2.exe    [Error] ld returned 1 exit status
                                这个问题经常出现,是不是我是初学者代码写的有点乱!

2015-11-30 13:52
张童
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2015-11-30
收藏
得分:0 
在线等,快来人啊
2015-11-30 14:10
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:10 
从基础功能开始重写吧

授人以渔,不授人以鱼。
2015-11-30 14:18
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
偷盗一段话送给你
以下是引用hellovfp在2015-11-27 11:19:31的发言:

另外,从程序设计的角度上来说,最好把数据的输入从数据结构代码分离出来。
函数接口专注于干一件事,你可以将初始化栈操作放入init_stack()函数里。
将,压栈操作放入push_stack()函数里,出栈操作放入pop_stack()函数里。。
遍历操作放入foreach_stack(), 消毁栈操作放入destory_stack().....

init_stck()只做初始化,不干压栈的事。
push_stack()只做压栈的操作,不处理数据从控制台输入输出的事儿。
这样代码可以变得更清晰,调试起来也方便。


授人以渔,不授人以鱼。
2015-11-30 14:32
张童
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2015-11-30
收藏
得分:0 
能问下用extern 能改变返回值得连接属性吗或者是指针类型的变量吗?
2015-11-30 14:46
张童
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2015-11-30
收藏
得分:0 
FILE *fp;
void save(DATE *head)     /*信息的保存*/
{
    DATE *p;
    if((fp=fopen("caonima.dat","w+"))==NULL)
    {
        printf("打开写入文件出错\n");
        fclose(fp);
    }
        while(p!=NULL)
              {
                  fp=fopen("cnm.dat","w+");
                  fprint(fp,"%d %s %d",p->num,p->name,p->score);
                  p=p->next;
              }
        fclose(fp);
}
还有这个把链表的数据保存入文件里的函数对吗?好像写这个函数问题比较多
2015-11-30 14:50
张童
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2015-11-30
收藏
得分:0 
我才刚学完谭浩强的C语言的书,这次是老师布置的一个任务,我弄的很不理想
2015-11-30 14:56
张童
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2015-11-30
收藏
得分:0 
现在只知道堆栈的概念
这个还是不太懂
另外,从程序设计的角度上来说,最好把数据的输入从数据结构代码分离出来。
函数接口专注于干一件事,你可以将初始化栈操作放入init_stack()函数里。
将,压栈操作放入push_stack()函数里,出栈操作放入pop_stack()函数里。。
遍历操作放入foreach_stack(), 消毁栈操作放入destory_stack().....

init_stck()只做初始化,不干压栈的事。
push_stack()只做压栈的操作,不处理数据从控制台输入输出的事儿。
这样代码可以变得更清晰,调试起来也方便。

2015-11-30 14:58
快速回复:用链表做学生信息管理出现问题
数据加载中...
 
   



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

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