前言
初学C语言,请大佬多提宝贵意见,感激不尽。欢迎各位初学者前来交流。
# include<stdio.h>
# include<stdlib.h>
# include<malloc.h>
# include<string.h>
typedef struct Student
{
char st_ID[20];
char st_name[20];
float st_score;
struct Student *pNext;
} STU;
STU head;
STU *p, *tail;
char filename1[20];
void InputStudent();
void OutputStudent();
void InsertStudent();
void DeleteStudent();
void RepairStudent();
void SearchStudent();
void ScalStudent();
void file();
void exchange();
int main(void)
{
int n;
head.pNext = NULL;
while(1)
{
printf("1. 创建学生成绩链表\n");
printf("2. 显示所有学生成绩\n");
printf("3. 在指定位置插入成绩信息\n");
printf("4. 根据学号删除成绩信息\n");
printf("5. 根据排列的“序号”修改成绩\n");
printf("6. 根据学号查询成绩\n");
printf("7. 计算平均成绩\n");
printf("8. 退出\n");
printf("9. 利用生成的文件进行读取和输出完成相应动作\n");
printf("\n 请输入你需要的功能选项\n");
scanf("%d", &n);
switch(n)
{
case 1: InputStudent(); break;
case 2: OutputStudent(); break;
case 3: InsertStudent(); break;
case 4: DeleteStudent(); break;
case 5: RepairStudent(); break;
case 6: SearchStudent(); break;
case 7: ScalStudent(); break;
case 8: exit(0); break;
case 9: file(); break;
}
}
return 0;
}
void InputStudent()
{
int i, len;
FILE *fp;
if(head.pNext != NULL)
{
printf("表格已存在\n");
return ;
}
tail = &head;
printf("请输入有多少个学生 len = ");
scanf("%d", &len);
flushall();
printf("请输入需要创建的文件名称 : ");
gets(filename1);
fp = fopen(filename1, "w");
for(i=0; i<len; i++)
{
p = (STU *)malloc(sizeof(STU));
p->pNext = NULL;
if(NULL == p)
{
printf("链表创建失败,空间不足\n");
exit(0);
}
printf("请输入第%d个学生的信息: ", i+1);
scanf("%s%s%f", p->st_ID, p->st_name, &p->st_score);
fprintf(fp, "序号%-3d%-10s%-10s%-5f", i+1,p->st_ID, p->st_name, p->st_score);
fputc('\n', fp);
tail->pNext = p;
tail = p;
}
fclose(fp);
return ;
}
void OutputStudent()
{
if(head.pNext == NULL)
{
printf("表格尚未创建\n");
return ;
}
p = head.pNext;
while(p != NULL)
{
printf("序号:%-3d%-10s%-10s%-5f\n", i, p->st_ID, p->st_name, p->st_score);
p = p->pNext;
}
return ;
}
void InsertStudent()
{
STU *sqr;
char ch[6];
sqr = (STU *)malloc(sizeof(STU));
if( NULL == sqr)
{
printf("插入失败\n");
return ;
}
if(NULL == head.pNext)
{
printf("表格尚未建立");
free(sqr);
return;
}
int i=0;
while(1)
{
p = &head;
printf("请输入查询的ID:");
scanf("%s", sqr->st_ID);
flushall();
while(p->pNext != NULL)
{
if((strcmp(p->pNext->st_ID, sqr->st_ID)) == 0)
{
printf("请输入插入的信息:");
scanf("%s%s%f", sqr->st_ID, sqr->st_name, &sqr->st_score);
sqr->pNext = p->pNext;
p->pNext = sqr;
return ;
}
p = p->pNext;
}
printf("ID不存在,请重新输入,若要退出,请输入1");
scanf("%d", &i);
if(i == 1)
return ;
}
return ;
}
void DeleteStudent()
{
char ch[20];
STU *str;
int i;
while(1)
{
p = &head;
printf("请输入需要删除的ID: ");
scanf("%s", ch);
while(p->pNext != NULL)
{
if(strcmp(p->pNext->st_ID , ch) == 0)
{
str = p->pNext;
p->pNext = str->pNext;
free(str);
return ;
}
p = p->pNext;
}
printf("ID不存在, 返回上次层按1, 继续按其他:\n");
scanf("%d", &i);
if(i == 1)
return ;
}
return ;
}
void RepairStudent()
{
int len, i;
if(head.pNext == NULL)
{
printf("表格不存在\n");
return ;
}
printf("请输入需要修改的序列号: ");
scanf("%d", &len);
while(len <1)
{
printf("输入的值小于1,请重新输入大于0的值:");
scanf("%d", &len);
}
int j=0, fla = 1;
while(fla)
{
p = &head;
fla = 0;
for(i=1; i<=len; i++)
{
p = p->pNext;
if((p->pNext == NULL) && (i<len))
{
fla = 1;
j = 1;
printf("输入的值过大,请输入小于%d的值 : ", i+1);
scanf("%d", &len);
while(len<1 || len>i)
{
printf("输入的值太小或太大,请看提示重新输入 : ");
scanf("%d", &len);
}
}
if(j == 1)
break;
}
}
printf("请输入需要插入的值 : ");
scanf("%s%s%f", p->st_ID, p->st_name, &p->st_score);
return ;
}
void SearchStudent()
{
char ch[20];
printf("请输入需要显示的ID : ");
while(1)
{
scanf("%s", ch);
p = head.pNext;
while(p != NULL)
{
if(strcmp(p->st_ID, ch) == 0)
{
printf("%-6s%-6s%-3f\n", p->st_ID, p->st_name, p->st_score);
return ;
}
p = p->pNext;
}
printf("输入的id有误,请重新输入: ");
}
return ;
}
void ScalStudent()
{
float avg, sum = 0;
int i=0;
p = head.pNext;
if(head.pNext == NULL)
{
printf("表格不存在\n");
return ;
}
while(p !=NULL)
{
sum += p->st_score;
i++;
p = p->pNext;
}
printf("sum = %f, i = %d\n", sum, i);
avg = sum/i;
printf("%f\n", avg);
return ;
}
void file()
{
int n;
STU head_1;
STU *tail_1, *p_1;
head_1.pNext = NULL;
tail_1 = &head_1;
FILE *fp_1;
fp_1 = fopen(filename1, "r");
if(fp_1 == NULL)
{
printf("文件创建失败\n");
return ;
}
while(!feof(fp_1))
{
p_1 = (STU *)malloc(sizeof(STU));
p_1->pNext = NULL;
if(NULL == p_1)
{
printf("创建失败\n");
return ;
}
n = fscanf(fp_1, "%s%s%f", p_1->st_ID, p_1->st_name, &p_1->st_score);
if(n != 3)
{
free(p_1);
break;
}
tail_1->pNext = p_1;
tail_1 = p_1;
}
printf("以下为工程输出\n");
p_1 = head_1.pNext;
while(p_1 != NULL)
{
printf("%-5s, %-5s, %-3f\n", p_1->st_ID, p_1->st_name, p_1->st_score );
p_1 = p_1->pNext;
}
return ;
}