| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 626 人关注过本帖, 1 人收藏
标题:哪位大虾帮帮忙?明天要答辩了,帮我解读下、
取消只看楼主 加入收藏
lap215266131
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2011-4-7
结帖率:0
收藏(1)
已结贴  问题点数:20 回复次数:2 
哪位大虾帮帮忙?明天要答辩了,帮我解读下、
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct stu
{
    int number;
    char name[20];
    int age;
    char sex[10];
    struct stu *next;
};

FILE *fp = NULL;
struct stu *Filetostr()//------------------------不懂
{
    struct stu *pf=NULL,*pb=NULL,*head=NULL,*p=NULL;
    if( (fp=fopen("student.txt","r")) == NULL )
    {
        printf("文件之前不存在!\n");
        return NULL;
    }
    pb=(struct stu *)malloc(sizeof(struct stu));//---------------------不懂
    head=pb;
    while(1)
    {
        pf=(struct stu *)malloc(sizeof(struct stu));//--------------------不懂
        if( fread(pf,sizeof(struct stu),1,fp) )
        {
            pb->number = pf->number;
            strcpy(pb->name, pf->name);
            pb->age = pf->age;
            strcpy(pb->sex, pf->sex);
            pb->next=(struct stu *)malloc(sizeof(struct stu));//---------------------不懂
            p=pb;
            pb=pb->next;
               
            free(pf);
        }
        else
        {
            p->next=NULL;
            free(pb);
            break;
        }
    }
    //pb=NULL;
    fclose(fp);
    return head;
}

void Strtofile(struct stu *head)//-----------------不懂
{   
    if( !head )
        return;
    struct stu *pb=NULL;
    pb=head;
    if((fp=fopen("student.txt","w"))==NULL)
    {
        printf("无法打开文件!\n");
        exit(-1);
    }
    while(pb)
    {
        fwrite(pb,sizeof(struct stu),1,fp);
        pb=pb->next;
    }
   
    fclose(fp);
    printf("保存成功!\n");
}

// 添加模块
struct stu *Add(struct stu *head)
{
    struct stu *pf=NULL,*pb=NULL,*p=NULL;
    int num;   
    printf("请输入学生信息\n");
    printf("请输入学生的学号:");
    scanf("%d",&num);
    pf = head;
    //设计应该是插入的时候就依照学号的从小到大来进行排序的
    if(head!=NULL)//不是第一次的插入新的元素
    {
        pb = (struct stu *)malloc(sizeof(struct stu));//-----------------不懂
        /*while( (pf->number<num) && (pf->next!=NULL) )如果只有一个结点的情况下
        即使前面的条件成立 后面的也不成立 总的是不成立的 就不能达到目的
        {
            p=pf;
            pf=pf->next;
        }*/
        while( pf &&  (pf->number<num))//表示过滤掉比这个学号小的人
        {
            p = pf;//p 指向的是比num 小的学号 或 NULL
            pf = pf->next;
        }//pf 出来指向的是不比num小的学号的结点 或 最后一个结点
        if(pf->number==num)//pf当前指向相等的情况
        {
            printf("你要添加的学生之前已经存在!\n");
            return head;
        }
        else if(pf->number>num)//pf当前指向大于num的情况
        {
            if(head==pf)//第一个结点就大于num
            {
                /*head=pb;
                pb->next=pf;*/
                pb->next = head;
                head = pb;//保证head总是指向第一个结点
            }
            else
            {
                p->next = pb;
                pb->next = pf;
            }
        }
        else if( pf == NULL )//pf当前指向最后一个结点
        {
            /*pf->next = pb;
            pb->next=NULL;*/
            pb->next = pf;
            pf = pb;
        }     
            //pb=(struct stu *)malloc(sizeof(struct stu));
    }
    else//第一次的插入
    {
        pb = (struct stu *)malloc(sizeof(struct stu));
        head = pb;
        pb->next = NULL;//进行未结点的处理
    }
    pb->number=num;
    printf("请输入学生的姓名:");
    scanf("%s",pb->name);
    printf("请输入学生的年龄:");
    scanf("%d",&pb->age);
    printf("请输入学生的性别(\"man\"表示男性, \"woman\"表示女性):");
    scanf("%s",pb->sex);
    printf("添加成功!\n");
    return head;
}
//查找模块
struct stu *Choose(struct stu *head)
{
   //加判断语句
    if( !head )
    {
        printf("未存有学生信息!\n");
        return NULL;
    }
    struct stu *pb=NULL;
    int num;
    printf("请输入你要查找的学生的学号:");
    scanf("%d",&num);
    pb = head;
    while( (pb->number!=num) && (pb->next!=NULL) )
    {
        
            pb = pb->next;
    }
    if(pb->number==num)
        return pb;
    else
        if( (pb->number!=num) && (pb->next==NULL) )
        printf("你要查找的学生不存在!\n");
    return NULL;
}
//删除模块
struct stu *Delete(struct stu *head)
{
    //加判断语句
    if( !head )
    {
        printf("未存有学生信息!\n");
        return NULL;
    }
    struct stu *pb=NULL,*pf=NULL;
    int num;
    printf("请输入你要删除的学生的学号:");
    scanf("%d",&num);
    pb=head;
    /*while( (pb->number!=num) && (pb->next!=NULL) )
    {
        pf=pb;
        pb=pb->next;
    }*/
    while( pb && (pb->number!=num) )//可以一直找到最后一个结点即 可以全部察寻一遍
    {
        pf = pb;
        pb = pb->next;
    }//假如找到 则pb就是要删除的 或则 就没有找到
    //if(pb->number==num)
    if( pb )//表示pb不为NULL 即 查询到了
    {
        if(pb==head)//第一个结点就找到
            head = pb->next;
        else
            pf->next = pb->next;
            //pf->next = pb->next;
        free(pb);
        printf("d删除成功!\n");
        return head;
    }
    else
        printf("你要删除的学生不存在!\n");
    return head;
}

struct stu *Update(struct stu *head)
{
    //加判断语句
    if( !head )
    {
        printf("未存有学生信息!\n");
        return NULL;
    }
    struct stu *pb=NULL;
    int num;
    printf("请输入你要更改的学生的学号:");
    scanf("%d",&num);
    pb=head;
    /*while((pb->number!=num)&&(pb->next!=NULL))
        pb=pb->next;*/
    while( pb && (pb->number!=num) )//如果pb非NULL 指向要修改的结点
        pb=pb->next;
    if( pb )
    {
        printf("请输入你要更改的学生的姓名:");
        scanf("%s",pb->name);
        printf("请输入修改后的学生的年龄:");
        scanf("%d",&pb->age);
        printf("请输入修改后的学生的性别(“man”表示男性,“woman”表示女性):");   
        scanf("%s",pb->sex);
        printf("更改成功!\n");
        return head;
    }
    else
        printf("你要修改的学生不存在!\n");
    return head;
}

void Print(struct stu *head)
{
    struct stu *pb=NULL;
    pb=head;
    while( pb )
    {
        printf("学号:%d    姓名:%s    年龄:%d    性别:%s\n",pb->number,pb->name,pb->age,pb->sex);
        pb = pb->next;
    }
}

void Window()
{
    printf("--------------------------------------------------------------------------------\n");
    printf("|******************************************************************************|\n");
    printf("|*************************10计科4学生信息管理系统******************************|\n");
    printf("|******************************************************************************|\n");
    printf("--------------------------------------------------------------------------------\n");
    printf("\n\n");
    printf("        1.添加学生信息\n");
    printf("        2.查找学生信息\n");
    printf("        3.删除学生信息\n");
    printf("        4.修改学生信息\n");
    printf("        5.显示学生信息\n");
   
    printf("        6.退出!\n");
    printf("\n\n");
}
   
int main()
{
    struct stu *head=NULL, *search_head=NULL;
    int ask;
    int saveask;
    int addask;
    printf("欢迎进入学生信息管理系统...\n");
    head = Filetostr();
    while(1)
    {
        Window();
        printf("请进行选择:");
        scanf("%d",&ask);
        switch(ask)
        {
        case 1:
            head = Add(head);
            while(1)
            {
                printf("是否继续进行添加(0表示继续,其他数字表示离开):");
                scanf("%d",&addask);
                if(addask)
                    break;
                head=Add(head);
            }
            break;
        case 2:
            search_head=Choose(head);
            if(search_head!=NULL)
                printf("学号:%d      姓名:%s   年龄:%d   性别:%s\n",search_head->number,search_head->name,search_head->age,search_head->sex);
            break;
        case 3:
            head=Delete(head);
            break;
        case 4:
            head=Update(head);
            break;
        case 5:
            Print(head);
            break;
        case 6:
            printf("****是否要进行保存:****\n\n");
            printf("输入0表示不进行保存退出,其他数字表示进行保存并退出:");
            scanf("%d",&saveask);
            if(saveask)
                Strtofile(head);
            exit(0);                  
        default:
                exit(-1);
        }            
    }
    return 0;
}
搜索更多相关主题的帖子: return 
2011-04-17 12:49
lap215266131
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2011-4-7
收藏
得分:0 
哪位大虾帮帮忙啊、、、、
2011-04-17 12:54
lap215266131
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2011-4-7
收藏
得分:0 
回复 3楼 张春平
问题1
为什么在添加的时候会出现不能添加第二个学生?一旦添加就显示不能进行了,如果可以添加第二个那在显示的时候就会无止尽的循环 能QQ语音交流吗???急求啊!!
2011-04-17 14:30
快速回复:哪位大虾帮帮忙?明天要答辩了,帮我解读下、
数据加载中...
 
   



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

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