|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
这是我的源代码
#include <stdio.h>
#include <stdlib.h>
typedef struct stu{
int num;
char name[10];
char sex;
int age;
struct stu *next;
}STU,*STUP; //声明一个结构体,里面包含学号、姓名、性别、年龄,还该结构体指针。
#define LEN sizeof(STU)
int main()
{
STUP head;
STUP creat(void); //建立链表函数。
STUP delet(STUP head,int age_temp);//删除要求年龄函数。
void print(STUP head);//输出链表函数
int age_temp;
printf("请输入学号、姓名、性别、年龄:\n");
head=creat();
print(head);
printf("请输入要删除的年龄:\n");
scanf("%d",&age_temp);
head=delet(head,age_temp);
printf("输出删除后的信息:\n");
print(head);
}
STUP creat(void) //建立链表函数
{
STUP p1,p2,head;
int n=0;
p1=p2=(STUP)malloc(LEN);
head=NULL;
scanf("%d %s %c %d",&p1->num,p1->name,&p1->sex,&p1->age);
while(p1->num!=0)
{
n=n+1;
if(n==1)
head=p1;
else p2->next=p1;
p2=p1;
p1=(STUP)malloc(LEN);
scanf("%d %s %c %d",&p1->num,p1->name,&p1->sex,&p1->age);
}
p2->next=NULL;
return head;
}
void print(STUP head) //输出链表函数
{
STUP p;
p=head;
if(head!=NULL)
do{
printf("%5d%7s%4c%5d\n",p->num,p->name,p->sex,p->age);
p=p->next;
}while(p!=NULL);
}
STUP delet(STUP head,int age_temp) //删除要求年龄函数
{
STUP h,p;
h=(STUP)malloc(LEN); //创建一个空结点
h->next=head;
head=h;
for(p=head;p->next!=NULL;p=p->next)
if(p->next->age==age_temp)
p->next=p->next->next;
head=head->next;
return head;
}
问:如何定义函数link_create、link_delete、link_insert 和link_outpout,分别完成链表的创建、按照年龄删除结点、在链表头插入新结点和链表元素输出显示。在主函数中依次调用这些函数来实现本题功能。
本帖最后由 一世轻尘 于 2020-12-23 10:59 编辑 //学生成绩管理系统
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
#define LEN sizeof(struct student)
//学生信息结构体
struct student
{
char name[10];//学生姓名
char id[15];//学生学号
int score[3];//学生三科成绩
struct student *next;
};
typedef struct student stu;
//声明函数
stu* enter(stu *h);//成绩录入函数
stu* initialize();//初始化链表头函数
void menu();//菜单
void print(stu *h);//成绩打印函数
void modify(stu *h);//成绩修改函数
void statistics(stu *h);//查找统计信息
void del(stu *h);//删除函数
void quit(stu *h);//退出函数
void save(stu *h);//保存文件函数
void open(stu *h);//打开文件读取信息建立链表函数
//主函数
int main()
{
stu *data;//指向链表头,建立成绩链表,所有学生信息存放 在此链表
int function;//功能选项
char flag;//判断变量
int t=0;
data=initialize();//初始化头结点
open(data);//读取文件内的数据,并建立链表
while(1)
{
menu();//打开菜单
printf("请选择操作:");
scanf("%d",&function);//输入你想要实现的功能
switch(function)//构建多个功能分支
{
case 1:while(1)
{
enter(data);//输入一个数据并连接在链表的后面
printf("是否继续输入(y/n)");
scanf("%s",&flag);
if(flag=='N'||flag=='n')break;
}system("cls");break;
case 2:print(data);_getch();system("cls");break;
case 3:modify(data);system("cls");break;
case 4:statistics(data);_getch();system("cls");break;
case 5:del(data);_getch();system("cls");break;
case 6:quit(data);break;
default:printf("error!!!请重新输入:");
break;
}//switch结束
}
return 0;
}
//系统界面显示
void menu()
{
printf(" *********************************************** \n");
printf(" **********学生成绩管理系统***************** \n");
printf(" *********************************************** \n");
printf(" 1.录入和添加成绩 \n");
printf(" 2.输出成绩 \n");
printf(" 3.修改成绩 \n");
printf(" 4.查找学生信息 \n");
printf(" 5.删除学生信息 \n");
printf(" 6.退出系统并保存 \n");
printf(" *********************************************** \n");
}
//初始化头节点函数
stu* initialize()
{
stu *head;
head=(stu*)malloc(LEN);
if(head==NULL)
{
printf("error!");
exit(1);
}
head->next=NULL;//使头结点指针域为空
return head;
}
//成绩录入
stu* enter(stu *h)
{
stu *p,*q=h;
char name[10],id[15];
int math, English,computer;
p=(stu*)malloc(LEN);//为学生信息申请节点
printf("请依次输入学生信息:\n");
printf("姓名 学号 数学 英语 计算机导论与程序设计\n");
scanf("%s %s %d %d %d",name,id,&math,&English,&computer);
for(;q->next!=NULL;q=q->next){;}//移动到尾结点
//将输入的内容赋值给链表中的相应位置
strcpy(p->name,name);
strcpy(p->id,id);
p->score[0]=math;
p->score[1]=English;
p->score[2]=computer;
p->next=NULL;
q->next=p;
q=p;
return h;
}
//成绩打印
void print(stu *h)
{
stu *p=h->next;//从头结点之后的结点开始输出
printf("%-15s%-10s%-10s%-10s%-10s\n","学号","姓名","数学","英语","计算机导论与程序设计");//左对齐的方式输出
while(p!=NULL)//输出链表的全部内容
{
printf("%-15s%-10s%-10d%-10d%-10d\n",p->id,p->name,p->score[0],p->score[1],p->score[2]);
p=p->next;
}
}
//成绩修改
void modify(stu *h)
{
stu *p=h->next;
char name[10],id[15];
int math,English,computer;
printf("请输入学生姓名:");
scanf("%s",name);
printf("请输入学生学号:");
scanf("%s",id);
while(p)
{
if(strcmp(p->name,name)==0&&strcmp(p->id,id)==0)
{
printf("当前学生信息:\n");
printf("%-15s%-10s%-10s%-10s%-10s\n","学号","姓名","数学","英语","计算机导论与程序设计");
printf("%-15s%-10s%-10d%-10d%-10d\n",p->id,p->name,p->score[0],p->score[1],p->score[2]);
printf("请输入更正后的数学成绩:");
scanf("%d",&math);
printf("请输入更正后的英语成绩:");
scanf("%d",&English);
printf("请输入更正后的计算机导论与程序设计成绩:");
scanf("%d",&computer);
p->score[0]=math;
p->score[1]=English;
p->score[2]=computer;
printf("更改完成!\n");
system("pause");
break;
}
else
{
p=p->next;
}
}//while循环结束
}
//查询统计
void statistics(stu *h)
{
while(1)
{
int z;//选项变量
system("cls");//清屏
printf("请输入查找方式:\n7.按姓名学号查找\n8.按成绩查找\n9.退出\n") ;
scanf("%d",&z);
system("cls");
switch(z)
{
case 7:{
stu *p=h->next;
char name[10],id[15];
printf("请输入学生姓名:");
scanf("%s",name);
printf("请输入学生学号:");
scanf("%s",id);
while (p)
{
if(strcmp(p->name,name)==0&&strcmp(p->id,id)==0)//比较姓名学号
{
printf("当前学生信息:\n");
printf("%-15s%-10s%-10s%-10s%-10s\n","学号","姓名","数学","英语","计算机导论与程序设计");
printf("%-15s%-10s%-10d%-10d%-10d\n",p->id,p->name,p->score[0],p->score[1],p->score[2]);
break;
}
else
{
p=p->next;
}
}//while循环结束
}system("pause");system("cls");break;
case 8:{
while(1){
int x;//选项变量
int num=0;//初始化满足条件的人数
printf("请输入按哪一科成绩进行查找:\n按数学成绩查找输入10\n按英语成绩查找输入11\n按计算机导论与程序设计成绩查找输入12\n退出输入13\n");
scanf("%d",&x);
switch(x)
{
case 10:{
stu *p1=h->next;
int M1,M2;
printf("请依次输入所要查找的数学成绩的下界与上界:\n");
scanf("%d %d",&M1,&M2);
printf("学生信息:\n");
printf("%-15s%-10s%-10s%-10s%-10s\n","学号","姓名","数学","英语","计算机导论与程序设计");
while(p1){
if((p1->score[0]-M1)>=0&&(p1->score[0]-M2<=0))
{
printf("%-15s%-10s%-10d%-10d%-10d\n",p1->id,p1->name,p1->score[0],p1->score[1],p1->score[2]);
num++;
p1=p1->next;
}
else
{
p1=p1->next;
}
}//while循环结束
printf("人数为%d\n",num);//输出人数
system("pause");
system("cls");
}break;
case 11:{
stu *p2=h->next;
int E1,E2;
printf("请依次输入所要查找的英语成绩的下界与上界:\n");
scanf("%d %d",&E1,&E2);
printf("学生信息:\n");
printf("%-15s%-10s%-10s%-10s%-10s\n","学号","姓名","数学","英语","计算机导论与程序设计");
while(p2){
if((p2->score[1]-E1)>=0&&(p2->score[2]-E2<=0))
{
printf("%-15s%-10s%-10d%-10d%-10d\n",p2->id,p2->name,p2->score[0],p2->score[1],p2->score[2]);
num++;
p2=p2->next;
}
else
{
p2=p2->next;
}
}//while循环结束
printf("人数为%d\n",num);
system("pause");
system("cls");
}
break;
case 12:{
stu *p3=h->next;
int C1,C2;
printf("请依次输入所要查找的计算机导论与程序设计成绩的下界与上界:\n");
scanf("%d %d",&C1,&C2);
printf("学生信息:\n");
printf("%-15s%-10s%-10s%-10s%-10s\n","学号","姓名","数学","英语","计算机导论与程序设计");
while(p3){
if((p3->score[2]-C1)>=0&&(p3->score[2]-C2<=0))
{
printf("%-15s%-10s%-10d%-10d%-10d\n",p3->id,p3->name,p3->score[0],p3->score[1],p3->score[2]);
num++;
p3=p3->next;
}
else
{
p3=p3->next;
}
}//while循环结束
printf("人数为%d\n",num);
system("pause");
system("cls");
}
break;
case 13:goto label2;//跳出双重循环
default:break;
}
}
label2:printf("已退出");
}system("pause");system("cls");break;
case 9:goto label1;//跳出双重循环
default:break;
}
}
label1:printf("已退出\n");
}
//删除函数
void del(stu *h)
{
stu *p=h,*q;
q=p->next;
char name[10],id[15];
printf("请输入学生姓名:");
scanf("%s",name);
printf("请输入学生学号:");
scanf("%s",id);
while(q)
{
if(strcmp(q->name,name)==0&&strcmp(q->id,id)==0)
{
p->next=q->next;
free(q);//删除p结点
printf("删除成功\n");
break;
}
else
{
p=p->next;
q=q->next;
}
}//while循环结束
}
//退出系统
void quit(stu *h)
{
save(h);//退出时保存信息
exit(0);
}
//打开文件
void open(stu *h)
{
stu *p=h;
stu *q;//临时变量,用于保存从文件中提取的信息
FILE*file=fopen("./Information.txt","rb");
if(!file)
{
printf("文件打开失败!");
return ;
}
q=(stu*)malloc(LEN);//开辟内存
fread(q,LEN,1,file);//进入循环前先读取一个结点
while(!feof(file))//判断是否到达文件结尾,如果没有就进入或继续循环
//否则,就绕过或结束循环
{
//代码执行到这里,说明没有到达文件结尾,本次读取的节点数据有效
p->next=q;//更新链表数据,把新的节点纳入链表
p=q;//更新链表数据,把新的节点纳入链表
q=(stu*)malloc(LEN);//分配内存,准备读取下一个结点
fread(q,LEN,1,file);//读取下一个结点,执行完此句,返回到while循环入口
}//while循环结束
p->next=NULL;//使尾结点指向空,结束链表
fclose(file);
}
//保存信息到文件中
void save(stu *h)
{
stu *p=h->next;
int flag;
FILE *file=fopen("./information.txt","wb");
if(!file)
{
printf("文件打开失败!");
return ;
}
while (p!=NULL)
{
flag=fwrite(p,LEN,1,file);//依次将p所指向的链表中的内容写入到文件中
if(flag!=1)
{
break;
}
p=p->next;
}
fclose(file);
}
给,我们的作业,除了要求输入的内容不一样外所有要求都实现了,稍微把函数名改一下,然后把文件那部分删了就行了
|
|