#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
typedef struct student{
int num;
int scores[3];
char name[20];
double average;
struct student *next;
}Node,*List;
Node *CreateHead();
void InsertNode(List head);
void Show(List head);
void modify(List head);
void Search(List head);
void sort(List head);
void deleteMsg(List head);
int main(int argc, char *argv[]) {
int i;
Node *h = (Node*)malloc(sizeof(Node));
h = CreateHead();
while(1){
printf("学生管理系统(可输入汉字)\n");
printf("^^^^^^^^^^^^^^^^^^^^^^^^^^^\n");
printf("1输入学生数据\t\t");
printf("2修改学生数据\t\t");
printf("3查找学生成绩\n");
printf("4排列学生数据\t\t");
printf("5保存学生成绩\t\t");
printf("6删除学生资料\n");
printf("7显示学生资料\t\t");
printf("0结束程序\n");
printf("^^^^^^^^^^^^^^^^^^^^^^^^^^^\n");
printf("操作方式:");
scanf("%d",&i);
switch(i){
case 1:
InsertNode(h);
break;
case 2:
modify(h);
break;
case 3:
Search(h);
break;
case 4:
sort(h);
break;
case 5:
break;
case 6:
deleteMsg(h);
break;
case 7:
Show(h);
break;
case 0:
printf("退出了学生管理系统");
exit(0);
break;
default:
printf("输入错误,请重新输入\n");
break;
}
}
return 0;
}
void add(List temp){
printf("请输入学生学号:\n");
scanf("%d",&temp->num);
printf("请输入学生姓名:\n");
scanf("%s",&temp->name);
printf("请输入学生语文成绩:\n");
scanf("%d",&temp->scores[0]);
printf("请输入学生数学成绩:\n");
scanf("%d",&temp->scores[1]);
printf("请输入学生英语成绩:\n");
scanf("%d",&temp->scores[2]);
}
Node *CreateHead(){
List head = (List)malloc(sizeof(Node));
head->next = NULL;
head->num = 0;
return head;
}
void InsertNode(List head){
Node *node = head;
Node *temp = (Node*)malloc(sizeof(Node));
add(temp);
while(node->next != NULL){
node = node->next;
}
node->next = temp;
}
void Show(List head){
if(head->next == NULL){
printf("学生为空,没有数据!!!\n");
}else{
List temp = head->next;
double average,sum=0;
printf("学号\t\t姓名\t\t语文成绩\t数学成绩\t英语成绩\t个人平均成绩\n");
while(temp != NULL){
for(int i = 0;i < 3;i++){
sum += temp->scores[i];
}
temp->average = sum/3;
printf("%d\t\t%s\t\t%d\t\t%d\t\t%d\t\t%.2lf\n",temp->num,temp->name,temp->scores[0],temp->scores[1],
temp->scores[2],temp->average);
temp = temp->next;
}
}
}
void modify(List head){
if(head->next == NULL){
printf("学生为空,没有数据!!!\n");
}else
{
int nums;
printf("请输入你要修改的学生学号:");
scanf("%d",&nums);
Node* temp = head->next;
while(temp != NULL){
if(temp->num == nums){
add(temp);
break;
}else{
temp = temp->next;
if(temp == NULL){
printf("系统中未存储此同学信息!");
break;
}
}
}
}
}
// int num,i=0,ch,ma,en;
// char str[20];
// printf("请输入你要修改的学生学号:");
// scanf("%d",&num);
// Node* temp = head;
// while(temp->next != NULL){
// if(temp->next->num == num){
// do{
// printf("请输入你要查找的内容\n");
// printf("1.姓名\t");
// printf("2.语文成绩\t");
// printf("3.数学成绩\t");
// printf("4.英语成绩\t");
// printf("5.退出修改\n");
// scanf("%d",&i);
// switch(i){
// case 1:
// printf("请输入修改的名称:");
// scanf("%s",&str);
// strcpy(temp->name,str);
// break;
// case 2:
// printf("请输入修改的语文成绩:");
// scanf("%d",&ch);
// temp->scores[0] = ch;
// break;
// case 3:
// printf("请输入修改的数学成绩:");
// scanf("%d",&ma);
// temp->scores[1] = ch;
// break;
// case 4:
// printf("请输入修改的英语成绩:");
// scanf("%d",&en);
// temp->scores[2] = ch;
// break;
// case 5:
// printf("修改功能已退出");
// exit(0);
// default:
// printf("输入错误,请正确输入1~5\n");
// break;
// }
// }while(1);
// }else{
// temp = temp->next;
// }
// }
void Search(List head){
if(head->next == NULL){
printf("链表为空!\n");
return;
}else{
int num,sum=0;
printf("请输入要查找的学生学号:");
scanf("%d",&num);
Node* temp = head->next;
while(temp != NULL){
if(temp->num == num){
for(int i = 0;i < 3;i++){
sum += temp->scores[i];
}
temp->average = sum/3;
printf("%d\t\t%s\t\t%d\t\t%d\t\t%d\t\t%.2lf\n",temp->num,temp->name,temp->scores[0],temp->scores[1],
temp->scores[2],temp->average);
break;
}else{
temp = temp->next;
if(temp == NULL){
printf("系统中没有所要的学生信息");
}
}
}
}
}
void sort(List head){
if(head->next == NULL){
printf("链表为空!\n");
return;
}else{
Node* temp = head->next;
Node* p;
Node* p1 = head;
while(temp != NULL){
p = temp->next;
if(temp->average < p->average){
p1->next = p;
temp->next = p->next;
p->next = temp;
}
temp = temp->next;
p1 = p1->next;
}
}
}
void deleteMsg(List head){
if(head->next == NULL){
printf("学生为空,没有数据!!!\n");
}else
{
int num;
printf("请输入要删除的学生学号:");
scanf("%d",&num);
Node* temp = head->next;
Node* p = head;
while(temp != NULL){
if(temp->num == num){
p->next = temp->next;
printf("删除成功!");
break;
}else{
temp = temp->next;
p = p->next;
if(temp == NULL){
printf("系统中没有所要删除的学生信息");
}
}
}
}
}
发现两个无关紧要的错误:
第77号: scanf("%s",&temp->name); 去掉&,name[]是字符数组, name已是地址,所以不用取址符&
第105行 删除average, 此变量没用过,不需要
修改完善如下,修改处见注释,供参考:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
typedef struct student{
int num;
int scores[3];
char name[20];
double average;
struct student *next;
}Node,*List;
Node *CreateHead();
void InsertNode(List head);
void Show(List head);
void modify(List head);
void Search(List head);
void sort(List head);
void save_file(List head); //修改
void deleteMsg(List head);
int main(int argc, char *argv[]) {
int i;
Node *h = NULL; //(Node*)malloc(sizeof(Node));
h = CreateHead();
while(1){
printf("学生管理系统(可输入汉字)\n");
printf("^^^^^^^^^^^^^^^^^^^^^^^^^^^\n");
printf("1 输入学生数据\t\t");
printf("2 修改学生数据\t\t");
printf("3 查找学生成绩\n");
printf("4 排列学生数据\t\t");
printf("5 保存学生成绩\t\t");
printf("6 删除学生资料\n");
printf("7 显示学生资料\t\t");
printf("0 结束程序\n");
printf("^^^^^^^^^^^^^^^^^^^^^^^^^^^\n");
printf("操作方式(0-7):");
scanf("%d",&i);
switch(i){
case 1:
InsertNode(h);
break;
case 2:
modify(h);
break;
case 3:
Search(h);
break;
case 4:
sort(h);
break;
case 5:
save_file(h); //修改
break;
case 6:
deleteMsg(h);
break;
case 7:
Show(h);
break;
case 0:
printf("退出了学生管理系统.\n");
exit(0);
break;
default:
printf("输入错误,请重新输入!\n");
break;
}
}
return 0;
}
void add(List temp){
printf("请输入学生学号:\n");
scanf("%d",&temp->num);
printf("请输入学生姓名:\n");
scanf("%s",temp->name); //scanf("%s",&temp->name); 修改
printf("请输入学生语文成绩:\n");
scanf("%d",&temp->scores[0]);
printf("请输入学生数学成绩:\n");
scanf("%d",&temp->scores[1]);
printf("请输入学生英语成绩:\n");
scanf("%d",&temp->scores[2]);
temp->average = (temp->scores[0]+temp->scores[1]+temp->scores[2])/3.0;//修改
}
Node *CreateHead(){
List head = (List)malloc(sizeof(Node));
head->next = NULL;
head->num = 0;
return head;
}
void InsertNode(List head){
Node *node = head;
Node *temp = (Node*)malloc(sizeof(Node));
temp->next = NULL; //修改
add(temp);
while(node->next != NULL){
node = node->next;
}
node->next = temp;
}
void Show(List head){
if(head->next == NULL){
printf("学生为空,没有数据!!!\n");
}else{
List temp = head->next;
//double average,sum=0; 修改
printf("学号\t\t姓名\t\t语文成绩\t数学成绩\t英语成绩\t个人平均成绩\n");
while(temp != NULL){
//for(i = 0,sum = 0;i < 3; i++){ //修改
// sum += temp->scores[i];
//}
//temp->average = sum/3;
printf("%d\t\t%s\t\t%d\t\t%d\t\t%d\t\t%.2lf\n",temp->num,temp->name,
temp->scores[0],temp->scores[1],temp->scores[2],temp->average);
temp = temp->next;
}
}
}
void modify(List head){
if(head->next == NULL){
printf("学生为空,没有数据!!!\n");
}
else{
int nums;
printf("请输入你要修改的学生学号:");
scanf("%d",&nums);
Node* temp = head->next;
while(temp != NULL){
if(temp->num == nums){
add(temp);
break;
}else{
temp = temp->next;
if(temp == NULL){
printf("系统中未存储此同学信息!");
break;
}
}
}
}
}
// int num,i=0,ch,ma,en;
// char str[20];
// printf("请输入你要修改的学生学号:");
// scanf("%d",&num);
// Node* temp = head;
// while(temp->next != NULL){
// if(temp->next->num == num){
// do{
// printf("请输入你要查找的内容\n");
// printf("1.姓名\t");
// printf("2.语文成绩\t");
// printf("3.数学成绩\t");
// printf("4.英语成绩\t");
// printf("5.退出修改\n");
// scanf("%d",&i);
// switch(i){
// case 1:
// printf("请输入修改的名称:");
// scanf("%s",&str);
// strcpy(temp->name,str);
// break;
// case 2:
// printf("请输入修改的语文成绩:");
// scanf("%d",&ch);
// temp->scores[0] = ch;
// break;
// case 3:
// printf("请输入修改的数学成绩:");
// scanf("%d",&ma);
// temp->scores[1] = ch;
// break;
// case 4:
// printf("请输入修改的英语成绩:");
// scanf("%d",&en);
// temp->scores[2] = ch;
// break;
// case 5:
// printf("修改功能已退出");
// exit(0);
// default:
// printf("输入错误,请正确输入1~5\n");
// break;
// }
// }while(1);
// }else{
// temp = temp->next;
// }
// }
void Search(List head){
if(head->next == NULL){
printf("链表为空!\n");
return;
}
else{
int num,sum=0;
printf("请输入要查找的学生学号:");
scanf("%d",&num);
Node* temp = head->next;
while(temp != NULL){
if(temp->num == num){
//for(int i = 0;i < 3; i++){ //修改
// sum += temp->scores[i];
//}
//temp->average = sum/3;
printf("学号\t\t姓名\t\t语文成绩\t数学成绩\t英语成绩\t个人平均成绩\n");
printf("%d\t\t%s\t\t%d\t\t%d\t\t%d\t\t%.2lf\n",temp->num,temp->name,
temp->scores[0],temp->scores[1],temp->scores[2],temp->average);
break;
}
else{
temp = temp->next;
if(temp == NULL){
printf("系统中没有所要的学生信息\n");
}
}
}
}
}
void sort(List head){ //修改
if(head->next == NULL){
printf("链表为空!\n");
return;
}
else{
Node* temp = NULL,* p = NULL,* p1 = NULL, *tail = NULL; //修改
while((head->next->next) != tail){ //修改
p1 = head;
temp = head->next;
while(temp->next != tail){ //修改
p = temp->next;
if(temp->average < p->average){
p1->next = p;
temp->next = p->next;
p->next = temp;
temp = p1->next; //修改
}
temp = temp->next;
p1 = p1->next;
}
tail = temp; //修改
}
}
}
void deleteMsg(List head){
if(head->next == NULL){
printf("学生为空,没有数据!!!\n");
}
else{
int num;
printf("请输入要删除的学生学号:");
scanf("%d",&num);
Node* temp = head->next;
Node* p = head;
while(temp != NULL){
if(temp->num == num){
p->next = temp->next;
free(temp); //修改
printf("删除成功!");
break;
}
else{
p = temp; //修改
temp = temp->next;
//p = p->next; 修改
if(temp == NULL){
printf("系统中没有所要删除的学生信息\n");
}
}
}
}
}
void save_file(List head) //修改
{
if(head->next == NULL){
printf("链表为空!\n");
return;
}
else{
int i;
FILE* fp;
List temp = head;
fp = fopen("student.txt","w");
if(fp == NULL) return;
while(temp->next){
fprintf(fp,"%d %s",temp->next->num,temp->next->name);
for(i=0;i<3;i++)
fprintf(fp," %d",temp->next->scores[i]);
fprintf(fp," %lf\n", temp->next->average);
temp = temp->next;
}
fclose(fp);
}
}
所谓修改删除文件a某位置的内容,其实是读打开文件a,再将‘a中修改删除位置之前的内容+修改删除的内容+a中修改删除位置之后的内容’保存到文件b,关闭文件a,删除文件a,将文件b改名为与之前文件a相同的名字,仅此而已。▼ http://bbs.csdn.net/topics/391975224
不知道你这个问题是否已经解决, 如果还没有解决的话: