| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 626 人关注过本帖, 1 人收藏
标题:哪位大虾帮帮忙?明天要答辩了,帮我解读下、
只看楼主 加入收藏
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:0 
代码帮你改过了,很小的改动,自己读一下吧
说实话,这个代码写的可真是不怎么样,要好好学习啊

程序代码:
#include <stdio.h>
#include <malloc.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);  // 这里不可以 free
            break;
        }
    }
    //pb=NULL;
    free(pb); // 应该放在这里
    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;
    pb = (struct stu *)malloc(sizeof(struct stu));
    //设计应该是插入的时候就依照学号的从小到大来进行排序的
    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小的学号的结点 或 最后一个结点
        // 必须先处理  pf == NULL 的情况,不然当 pf == NULL 时,程序依然会试图读取 pf->number,,也就是 NULL->number,自然会引发 segment error.
        if( pf == NULL )//pf当前指向最后一个结点
        {
            /*pf->next = pb;
             *           pb->next=NULL;*/
            pb->next = pf;
            //pf = pb; //改变 pf 的值对链表没有任何影响;
            p->next = pb;
        }
        else 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;
            }
        }
        //pb=(struct stu *)malloc(sizeof(struct stu));
    }
    else//第一次的插入
    {
        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 6:
                Print(head);
                break;
            case 6:
                printf("****是否要进行保存:****\n\n");
                printf("输入0表示不进行保存退出,其他数字表示进行保存并退出:");
                scanf("%d",&saveask);
                if(saveask)
                     Strtofile(head);
                exit(0);                   
            default:
                 exit(-1);
        }            
    }
}


[ 本帖最后由 voidx 于 2011-4-17 21:14 编辑 ]
2011-04-17 21:09
ucyan
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:61
专家分:198
注 册:2011-4-12
收藏
得分:3 
以下是引用我菜119在2011-4-17 15:20:28的发言:

这样的程序几乎每个学校都作为毕业设计的题目吧??这样的答辩又有什么用呢?
这个应该是大一学生做的吧~~我记得我大一的时候也做过这道题,是大一第一学期C++的课程设计来的~~~
不是毕业答辩吧~
2011-04-17 21:25
快速回复:哪位大虾帮帮忙?明天要答辩了,帮我解读下、
数据加载中...
 
   



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

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