C基础学习(四)
今天早上,沈老师给我们布置了一个有关于“学生信息管理系统”小项目,要求如下:
1.录入学生信息;
2.打印学生信息;
3.保存学生信息;
4.读取学生信息;
5.统计所有学生人数;
6.查找学生信息;
7.修改某个学生的信息;
由于我们是头一次做项目,所以沈老师先带着我们有关项目的前两道问题。因为要根据用户输入的学生信息的多少来自动存取和操作,因此我们要用通过使用结构体、指针、函数、链表等来实现相关操作!
那什么是链表呢?链表是一种常见的重要的数据结构。它是动态地进行存储分配的一种结构。它可以根据需要开辟内存单元。链表有一个“头指针”变量,以head表示,它存放一个地址。该地址指向一个元素。链表中每一个元素称为“结点”,每个结点都应包括两个部分:一为用户需要用的实际数据,二为下一个结点的地址。因此,head指向第一个元素:第一个元素又指向第二个元素;……,直到最后一个元素,该元素不再指向其它元素,它称为“表尾”,它的地址部分放一个“NULL”(表示“空地址”),链表到此结束。
单向链表的每个结点中除信息域以外还有一个指针域,用来指出其后续结点,单向链表的最后一个结点的指针域为空(NULL)。单向链表由头指针唯一确定,因此单向链表可以用头指针的名字来命名,例如头指针名为head的单向链表称为表head,头指针指向单向链表的第一个结点。
简单实现为:
#define NULL 0
typedefint DATATYPE
typedefstruct node
{DATATYPE info;
node *next;
}LINKLIST;
每个结点中只包括一个指向下个结点的指针域,这种链表称为单向链表。如果要在单向链表一个指针所指的当前位置插入一个新结点,就必须从链表头指针开始逐个遍历直到当前指针所指结点的前一结点,修改这个结点的指针。双向链表的每个结点中包括两个指针域,分别指向该结点的前一个结点和后一个结点。在双向链表中由任何一个结点都很容易找到其前面的结点和后面的结点,而不需要在上述的插入(及删除)操作中由头结点开始寻找。
简单实现为:
typedefstruct node
{ DATATYPE info;
node *priv, *next;
}DINKLIST;
单向链表的最后一个结点的指针域为空(NULL)。如果将这个指针里利用起来,以指向单向链表的第一个结点,就组成一个单向循环链表。
以下是我所做的有关于“学生信息管理系统”项目的相关代码的实现:
#include <stdio.h>
typedef struct _Student
{
int number;
char name[10];
int age;
int score;
}Student;
typedef struct _Node
{
Student stu[2];//学生信息
struct _Node * next;//指向下一个的学生
}Node;
Node * head=NULL;//定义一个指针
void inputStudent()
{
printf("\n请在这里是输入学生信息:学号,姓名,年龄,成绩:\n");
Node * p;
//p指向最后一个学生
p=head;
while (head!=NULL&&p->next!=NULL)
{
p=p->next;
}
//为新的学生分配一个空间
Node * newnode=(Node *)malloc(sizeof(Node));
newnode->next=NULL;
if(head==NULL)
{
head=newnode;
p=head;
}
else
{
p->next=newnode;//p的下一个结点为newnode
}
//输入新的学生数据
scanf("%d%s %d %d",&newnode->stu[0].number,newnode->stu[0].name,&newnode->stu[0].age,&newnode->stu[0].score);
printf("\n恭喜您,数据已添加成功!\n");
}
void printStudent()
{
printf("\n打印学生信息:\n");
Node *p;
p=head;//指向第一个学生
while (p!=NULL)
{
printf("\n学号%d,姓名%s,年龄%d,成绩%d\n",p->stu[0].number,p->stu[0].name,p->stu[0].age,p->stu[0].score);
p=p->next;
}
printf("\n恭喜您,数据已打印成功!");
}
void saveStudent()
{
printf("\n保存学生信息:\n");
FILE *fp;
fp=fopen("//Users//mac//Desktop//students.txt","w");
Node *p;
p=head;//指向第一个学生
while (p!=NULL)
{
fprintf(fp,"%d,%s,%d,%d\n",p->stu[0].number,p->stu[0].name,p->stu[0].age,p->stu[0].score);
p=p->next;
}
fclose(fp);
printf("\n恭喜您,数据已保存成功!");
}
void readStudent()
{
printf("\n读取学生信息:\n");
FILE *fp;
fp=fopen("//Users//mac//Desktop//students.txt","r");
Node *p;
while (p!=NULL)
{
fscanf(fp,"学号:%d, 姓名:%s,年龄:%d,分数:%d ",&p->stu[1].number,p->stu[1].name,&p->stu[1].age,&p->stu[1].score);
p=p->next;
}
fclose(fp);
p=head;//指向第一个学生
while (p!=NULL)
{
printf("\n学号:%d,姓名:%s,年龄:%d,分数:%d\n",p->stu[0].number,p->stu[0].name,p->stu[0].age,p->stu[0].score);
p=p->next;
}
printf("\n恭喜您,数据已读取成功!");
}
int countStudent()
{
printf("\n这里是统计学生人数:\n");
Node *p;
p=head;
int n=0;
while(p!=NULL)
{
n++;
p=p->next;
}
printf("\n学生信息管理库中总共有%d名学生!\n",n);
}
Student * findStudent()
{
printf("\n查找学生信息:\n");
int stu_id;
printf("\n请输入您要查学生的学号:\n");
scanf("%d",&stu_id);
Node *p;
p=head;
while(p!=NULL)
{
if(p->stu[0].number==stu_id)
{
printf("\n要查学生的学号:%d,姓名:%s,年龄:%d,成绩:%d",p->stu[0].number,p->stu[0].name,p->stu[0].age,p->stu[0].score);
break;
}
else
{
p=p->next;
}
}
if(p==NULL)
{
printf("\n对不起,该名学生的信息不存在,请重新输入!\n");
}
}
void modifyStudent()
{
printf("\n修改学生信息:\n");
int stu_id;
printf("\n请输入您要修改学生的学号:\n");
scanf("%d",&stu_id);
Node *p;
p=head;
while(p!=NULL)
{
if(p->stu[0].number==stu_id)
{
printf("\n要修改学生的学号:%d,姓名:%s,年龄:%d,成绩:%d",p->stu[0].number,p->stu[0].name,p->stu[0].age,p->stu[0].score);
printf("\n请重新输入该学生的新信息\n");
printf("学号: ");
scanf("%d", &p->stu[0].number);
printf("姓名: ");
scanf("%s", p->stu[0].name);
printf("年龄: ");
scanf("%d",&p->stu[0].age);
printf("成绩: ");
scanf("%d",&p->stu[0].score);
break;
}
else
{
p=p->next;
}
}
if(p==NULL)
{
printf("\n对不起,该名学生的信息不存在,请重新输入!\n");
}
}
int main(int argc, const char * argv[])
{
printf("欢迎使用学生信息管理系统\n");
printf("作者:张鹏伟;\n时间:2013.11.22;\n版本:V1.0\n");
while (1) {
printf("\n---【请输入管理功能表:】---");
printf("\n 【1.输入学生信息:】");
printf("\n 【2.打印学生信息:】");
printf("\n 【3.保存学生信息:】");
printf("\n 【4.读取学生信息:】");
printf("\n 【5.统计学生人数:】");
printf("\n 【6.查找学生信息:】");
printf("\n 【7.修改学生信息:】");
printf("\n 【8.退出:】");
printf("\n 请输入您对功能的选择:\n");
char c;
scanf(" %c",&c);
switch (c) {
case '1':
inputStudent();
break;
case '2':
printStudent();
break;
case '3':
saveStudent();
break;
case '4':
readStudent();
break;
case '5':
countStudent();
break;
case '6':
findStudent();
break;
case '7':
modifyStudent();
break;
case '8':
case '0':
return 0;
break;
default:
break;
}
}
return 0;
}