学生管理系统

来源:互联网 发布:dbc2000数据库 中文版 编辑:程序博客网 时间:2024/04/30 05:17

/*学生成绩管理系统*/

/*2010-09-08*/

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#define N 2

 

typedef struct student

{

    char name[20];

    int chinese;

    int math;

    struct student* next;

}STUDENT;

 

/************************************************************

 *函数名称:init_list

 *函数功能:初始化链表

 *函数参数:传入链表头指针的指针

 *返回值: 

 * *********************************************************/

void init_list(STUDENT** pHead)

{

    if(NULL!=*pHead)

    {

        printf("in init_list, you cannot creat a list here!/n");

        exit(-1);

    }

 

    *pHead=(STUDENT*)malloc(sizeof(STUDENT));

 

    if(NULL==*pHead)

    {

        printf("in init_list, malloc error!/n");

        exit(-1);

    }

 

    memset(*pHead,0,sizeof(STUDENT));//

    printf("init_list success! well done!/n");

}

/********************************************************

 *函数名称:add_node

 *函数功能:添加一个学生的信息

 *函数参数:传入链表头指针

 *返回值: 

 * ******************************************************/

void add_node(STUDENT* pHead)//add one student's information

{

    if(NULL==pHead)

    {

        printf("in add_node, the pHead is NULL,you cannot add a node here!/n");

        exit(-1);

    }

 

    while(pHead->next!=NULL)//调试正确前写成了while(pHead!=NULL)!!

    {

        pHead=pHead->next;//这样直到它指向最后一个节点

    }

 

    pHead->next=(STUDENT*)malloc(sizeof(STUDENT));//在最后一个节点的next处开辟空间!!!!

    pHead=pHead->next;

    printf("请输入学生信息:姓名,中文成绩,数学成绩/n");

    scanf("%s%d%d",pHead->name,&pHead->chinese,&pHead->math);//&pHead->chinese!!!!

    getchar();//如果没有这一句的话,如果在上面scanf输入过程中,最后多按了一些空格键的话,就有可以出现段错误!!!!这句getchar()用于取走缓存里的"/n"

    pHead->next=NULL;//NULL

    printf("add_node success! well done!/n");

}

/***********************************************************

 *函数名称:dele_node

 *函数功能:删除某个学生的成绩信息

 *函数参数:传入链表头指针

 *返回值: 

 * ********************************************************/

void dele_node(STUDENT* pHead)

{

    if(NULL==pHead)

    {

        printf("in dele_node, *pHead is NULL!/n");

        exit(-1);

    }

 

    if(NULL==pHead->next)//这一步判断很有必要!

    {

        printf("in dele_node, the list is empty!/n");

        exit(-1);

    }

 

    printf("请输出要删除的学生的姓名:/n");

    char std_name[20];

    scanf("%s",std_name);

    getchar();

    STUDENT* pDel=pHead->next;//这一步也是关键!

 

    while(NULL!=pDel)//遍历链表

    {

        if(strcmp(pDel->name,std_name)==0)//判断字符串相等与否,用strcmp();

        {

            pHead->next=pDel->next;

            free(pDel);

            printf("该学生信息删除成功!/n");

            return ;

        }

        pHead=pDel;

        pDel=pDel->next;

    }

 

    printf("sorry! cannot find the student you request!/n");

   

}

/********************************************************

 *函数名称:display_list

 *函数功能:显示整个链表的学生信息

 *函数参数:传入链表头指针

 *返回值: 

 * *****************************************************/

void display_list(STUDENT* pHead)

{

    if(NULL==pHead)

    {

        printf("in display_list,pHead is NULL!/n");

        exit(-1);

    }

 

    if(NULL==pHead->next)//判断链表是否为空,这一步判断很有必要!!

    {

        printf("in display_list, the list is empty!/n");

        exit(-1);

    }

 

    STUDENT* p=pHead->next;

 

    while(p!=NULL)//遍历整个链表

    {

        printf("学生姓名:%s/t中文成绩:%d/t数学成绩:%d/n",p->name,p->chinese,p->math);//p->name?!!

        p=p->next;

    }

 

    printf("display_list success!well done!/n");

}

/******************************************************

 *函数名称:find_node

 *函数功能:查找某学生的信息

 *函数参数:传入链表头指针

 * 返回值: 返回所对应的学生的地址

 * ***************************************************/

STUDENT* find_node(STUDENT* pHead)

{

    if(NULL==pHead)

    {

        printf("in find_node, pHead is NULL/n");

        exit(-1);

    }

 

    if(NULL==pHead->next)

    {

        printf("in find_node,the list is empty!/n");

        return ;

   

    }

 

    char std_name[20];

    printf("请输入要查找的学生的姓名:/n");

    scanf("%s",std_name);

    getchar();//用于取走缓存里的"/n"

 

    while(pHead->next!=NULL)

    {

        pHead=pHead->next;

 

        if(strcmp(std_name,pHead->name)==0)//别忘了"==0"

        {

            printf("找到了!%s/n",pHead->name);

            return pHead;

        }

    }

 

    printf("in find_node, cannot fine the request name!/n");

    return NULL;

}

/************************************************************

 *函数名称:dele_list

 *函数功能:删除整个链表(包括头节点)

 *函数参数:传入链表头指针

 *返回值: 

 * *********************************************************/

void dele_list(STUDENT** pHead)//删除整个链表(包括头节点)

{

    if(NULL==*pHead)

    {

        printf("in dele_list,pHead is NULL/n");

        exit(-1);

    }

/*   // if(NULL==*pHead->next)

   // {

     //   printf("in dele_list, the list is empty!/n");//

     //   不能写这一部分!因为即使链表是空的也要把头节点删除掉

     // return ;

    //}*/

    STUDENT* p=*pHead;

    STUDENT* pnext=NULL;

 

    while(p!=NULL)

    {

        pnext=p->next;

        free(p);

        p=pnext;

    }

    *pHead=NULL;

    printf("dele_list success! well done!/n");

}

/**********************************************************

 *main函数

 * *******************************************************/

int main(void)

{

    STUDENT* listhead=NULL;

    init_list(&listhead);//初始化链表

    int i=0;

 

    for(i=0;i<N;i++)

    {

        add_node(listhead);//输入学生成绩信息

    }

 

    STUDENT* p=NULL;

    p=find_node(listhead);//查找某学生成绩

    printf("找出来的学生:%s/n",p->name);

    display_list(listhead);//显示学生成绩

    dele_node(listhead);   //删除某个学生的成绩信息

    display_list(listhead);

    dele_list(&listhead);  //删除整个链表

    display_list(listhead);

    return 0;

}

原创粉丝点击