/*学生成绩管理系统*/
/*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;
}