1.录入学生信息2.打印学生信息3.保存学生信息4.读取学生信息5.统计学生信息6查找学生信息7修改某个学生的信息
难点的处理
1.文件的操作
数据写入文件
fp:fopen的时候关键字 w,r a 都需要小写.
p = head;
while(p != NULL)
{
fprintf(fp,"%s,%d,%d,%d",p->stu.name,p->stu.number,p->st.age,p->stu.score);
p = p->next;
}
//写入文件的时候,尽可能添加/n,以防止 头尾相接….成一个运算符或者数字
读出文件
while(!feof(fp))
{
Node *node = malloc…
fscaf(fp,"%s,%d,%d,%d\n",node->stu.name,&node->stu.number,…..);
//写入的格式和写出的格式相同才行.
if(head == null)
{
head = node;
p =head
}
else
p->next = node;
if(p->next != NULL)
p = node;
}
2.节点的删除
当我们移除某个节点并重新连接之后,一定要free(the Node),放置空间的占用.
while(p -> next != null)
if(p->next->stu.number == num)
{
node *p2;
p2 = p->next;
if(p2->next != null)
p->next = p2->next;
else
p->next = null;
p = p->next;
free(p2);
}
在实现的时候出现了几个难点.再次阐述下自己的想法.
1.我们需要把头指针 NodeLinkList定义在什么位置?
一般来说,我们在定义 head 的时候,定义在 main函数中.这也是我以前的作法.今天我把这个head 定义在 全局变量上,而不是在mian函数中.这样子的话,我再定义函数的时候 直接就调用了这个head ,省去了在函数参数中传值那样的麻烦操作.
NodeLinkList head = NULL;
//1.录入学生信息
仔细看看我的函数实现代码,就会发现,我基本没有使用参数,就是因为我把head 定义在了外边.真的很不错的感觉~
2.文件的载入
//3.保存学生信息
void saveStudent()
{
printf("\n存储学生信息到文件:\n");
NodeLinkList p = head;
FILE *fp;
char lastfilename[20];
char prefileName[50] = "/Users/len/Desktop/";
printf("请输入文件夹名称:");
scanf("%s",lastfilename);
char *filename = strcat(prefileName, lastfilename);
printf("文件夹路径为: %s\n",filename);
if (!(fp = fopen(filename, "a"))) {
printf("文件打开失败.\n");
}
else
{
while (p) {
fprintf(fp, "%d\t%s\t%d\t%f\n",p->stu.id,p->stu.name,p->stu.age,p->stu.score);
p = p->next;
}
printf("文件保存成功!\n");
}
fclose(fp);
}
当我在文件载入的时候,考虑到了 结构体之间的间距用什么来表示呢 ?起初用的时 " ",发现能够成功执行.
后来就改为了 /t /n.fscaf 里面是可以使用 /t /n的.这和 scanf 函数可是一个很大的区别哦
我感觉文件的输入输出和 控制台的输入输出恰恰相反有木有?
3.文件的加载
说文件的加载,有点宽泛,恰当的说应该是结构体文件的加载.说实话这可真的难倒我了. 刚开始的时候想使用 !feof(fp)来实现加载,但是没有成功.
后来就是用了
while( fscanf(fp, "%d%s%d%f",&newNode->stu.id,newNode->stu.name, &newNode->stu.age,&newNode->stu.score) != EOF)
{
}
来实现加载.我们应该理解到 fscanf文件的加载是读取完之后 fp指针下移.
而且,我们在实现文件的加载的时候, 一定要记住 p指针的响应移动,这样子可以减小时间复杂度.
代码如下:
else
{
newNode = malloc(sizeof(Node));
while( fscanf(fp, "%d%s%d%f",&newNode->stu.id,newNode->stu.name, &newNode->stu.age,&newNode->stu.score) != EOF)
{
p->next = newNode;
newNode->next = NULL;
p = newNode;
newNode = malloc(sizeof(Node));
}
好了,完整的代码有拉~~如下:
但是有一个提醒,这个文件加载之后会多出来一行 0 0 0 0.0的问题,暂时还没有解决.有想法的朋友给小弟支支招吧~~~
打印学生信息:
0 0 0.0
1 2 3 4.0
3 4 5 0.0
//
// main.c
// 学生成绩管理系统
//
// Created by lichan on 13-11-22.
// Copyright (c) 2013年 com.lichan. All rights reserved.
//
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NAMELENGTH 10
typedef struct _student{
int id;
char name[NAMELENGTH];
int age;
float score;
}student;
typedef struct _Node
{
student stu;
struct _Node *next;
}Node,*NodeLinkList;
NodeLinkList head = NULL;
//1.录入学生信息
void inputStudent()
{
printf("\n录入学生信息\n:");
Node *newNode = malloc(sizeof(Node));
newNode->next = NULL;
printf("请输入学生信息(格式:班级 姓名 年龄 分数):");
scanf("%d %s %d %f",&newNode->stu.id,newNode->stu.name, &newNode->stu.age,&newNode->stu.score);
NodeLinkList p = head;
if (head == NULL) {
head = malloc(sizeof(Node));
head = newNode;
}
else
{
while (p->next)
p = p->next;
p->next = newNode;
}
printf("%s 同学信息成绩录入成功.\n",newNode->stu.name);
}
//2.打印学生信息
void printStudent()
{
printf("\n打印学生信息:\n");
NodeLinkList p =head;
while (p!= NULL) {
printf("%d %s %d %3.1f\n",p->stu.id,p->stu.name,p->stu.age,p->stu.score);
p = p->next;
}
}
//3.保存学生信息
void saveStudent()
{
printf("\n存储学生信息到文件:\n");
NodeLinkList p = head;
FILE *fp;
char lastfilename[20];
char prefileName[50] = "/Users/len/Desktop/";
printf("请输入文件夹名称:");
scanf("%s",lastfilename);
char *filename = strcat(prefileName, lastfilename);
printf("文件夹路径为: %s\n",filename);
if (!(fp = fopen(filename, "a"))) {
printf("文件打开失败.\n");
}
else
{
while (p) {
fprintf(fp, "%d\t%s\t%d\t%f\n",p->stu.id,p->stu.name,p->stu.age,p->stu.score);
p = p->next;
}
printf("文件保存成功!\n");
}
fclose(fp);
}
//4.读取学生信息
void loadStudent()
{
printf("\n从文件读取学生信息:\n");
FILE *fp;
char lastfilename[20];
printf("请输入所要读取的文件名称:");
scanf("%s",lastfilename);
char prefileName[50] = "/Users/len/Desktop/";
char *fimename = strcat(prefileName, lastfilename);
head = malloc(sizeof(Node));
NodeLinkList newNode,p =head;
if (!(fp =fopen(fimename, "r") ) ) {
printf("文件打开失败.\n");
}
else
{
newNode = malloc(sizeof(Node));
while( fscanf(fp, "%d%s%d%f",&newNode->stu.id,newNode->stu.name, &newNode->stu.age,&newNode->stu.score) != EOF)
{
p->next = newNode;
newNode->next = NULL;
p = newNode;
newNode = malloc(sizeof(Node));
}
printf("文件加载成功!\n");
// head = p->next;
}
fclose(fp);
}
//5.统计学生信息
void countStudent()
{
printf("\n统计学生信息:\n");
NodeLinkList p =head;
int count = 0;
while (p) {
p = p->next;
count++;
}
printf("一共有%d 位同学.\n",count);
}
//6查找学生信息
void findStudent()
{
printf("\n查找学生信息:\n");
printf("请输入索要查询同学的学号:");
int sid ;
scanf("%d",&sid);
NodeLinkList p = head;
while (p) {
if (p->stu.id == sid) {
break;
}
p = p->next;
}
printf("索要查询的学号为%d 的同学信息为:\n",sid);
printf("%d %s %d %3.1f\n",p->stu.id,p->stu.name,p->stu.age,p->stu.score);
}
//7修改某个学生的信息
void modifyStudent()
{
printf("\n修改学生信息:\n");
printf("请输入索要修改的同学的学号:");
int sid ;
scanf("%d",&sid);
NodeLinkList p = head;
while (p) {
if (p->stu.id == sid) {
break;
}
p = p->next;
}
printf("请输入学号为%d 的学生信息(格式:班级 姓名 年龄 分数):",sid);
scanf("%d %s %d %f",&p->stu.id,p->stu.name, &p->stu.age,&p->stu.score);
}
int main(int argc, const char * argv[])
{
printf("欢迎使用学生成绩管理系统(version1.0):\n\n");
while (1) {
printf("请进行功能选择:\n");
printf("1 录入 2打印\n");
printf("3 保存 4读取\n");
printf("5 统计 6查找\n");
printf("7 修改 8~退出\n");
int ch ;
scanf("%d",&ch);
getchar();
switch (ch) {
case 1:
inputStudent();
break;
case 2:
printStudent();
break;
case 3:
saveStudent();
break;
case 4:
loadStudent();
break;
case 5:
countStudent();
break;
case 6:
findStudent();
break;
case 7:
modifyStudent();
break;
case 8:
return 0;
default:
return 0;
}
}
// insert code here...
printf("Hello, World!\n");
return 0;
}