实验4 链表综合.docx
《实验4 链表综合.docx》由会员分享,可在线阅读,更多相关《实验4 链表综合.docx(16页珍藏版)》请在冰豆网上搜索。
实验4链表综合
河南工业大学实验报告
课程名称:
C语言程序设计开课实验室:
6307
专业班级
计类1503
学号
201516920301
姓名
杨万理
实验项目名称
函数与程序结构
实验日期
2016.3.23
成绩评定
95
实验报告撰写要求:
认真总结实验,规范撰写实验报告。
实验报告内容应包括实验目的、实验要求、实验过程、实验总结,其中实验过程应附必要的截图,给出详细说明,对本实验中自行完成的较复杂网络拓扑的配置实现,应用表格给出各设备的主要参数配置(见下表),最后,对实验中遇到的问题和解决进行描述和剖析,总结收获。
并完成思考题。
设备参数配置一览表:
设备名称/编号
端口名称/编号
IP地址
子网掩码
网关
其他配置说明
SA
F0/1
202.102.46.8
255.255.255.0
202.102.46.254
RJ45100M以太网连接
一、实验目的:
1.掌握单链表的概念和建立方法。
2.掌握单链表的几种基本操作。
二、实验环境:
Vc
三、实验要求:
(略)
四、实验内容:
#include
#include
#include
structstudent
{
charnum[20];
charname[30];
ints1,s2,s3,s;
structstudent*next;
};
voidprint(structstudent*head);
structstudent*creat();
voidfail(structstudent*head);
voidsearch(structstudent*head,char*num1);
structstudent*Delet(structstudent*head,char*num);
structstudent*Insert(structstudent*head,structstudent*stud);
intCOUNT=0;
intmain()
{
structstudent*head=NULL;
structstudent*p;
ints1,s2,s3,s;
charnum[20],name[30];
intchoice;
while
(1)
{
putchar(10);
printf("欢迎进入学生信息管理系统\n");
printf("********************\n");
printf("*1--创建学生信息*\n");
printf("*2--浏览学生信息*\n");
printf("*3--查询学生信息*\n");
printf("*4--删除学生信息*\n");
printf("*5--添加学生信息*\n");
printf("*6--查看不及格学生信息*\n");
printf("*0--退出程序*\n");
printf("********************\n");
putchar(10);
printf("请输入你的选择:
");
scanf("%d",&choice);
switch(choice)
{
case1:
head=creat();
print(head);
break;
case2:
print(head);
break;
case3:
printf("请输入要查找的学号:
");
scanf("%s",num);
search(head,num);
break;
case4:
printf("请输入要删除的学生学号:
");
scanf("%s",num);
head=Delet(head,num);
print(head);
break;
case5:
printf("输入学生的学号、姓名、3科成绩:
\n");
scanf("%s%s%d%d%d",num,name,&s1,&s2,&s3);
s=s1+s2+s3;
p=(structstudent*)malloc(sizeof(structstudent));
strcpy(p->num,num);
strcpy(p->name,name);
p->s1=s1;
p->s2=s2;
p->s3=s3;
p->s=s;
head=Insert(head,p);
print(head);
break;
case6:
fail(head);
case0:
exit(0);
}
}
}
structstudent*creat()
{
structstudent*head,*tail,*p;
ints1,s2,s3,s;
intsize=sizeof(structstudent);
head=tail=NULL;
while
(1)
{
charnum[20]={0},name[30]={0};
printf("请输入第%d学生的学号,姓名,三科成绩,以#结束:
\n",COUNT+1);
scanf("%s",num);
if(strcmp(num,"#")==0)
{
break;
}
else
{
scanf("%s%d%d%d",name,&s1,&s2,&s3);
s=s1+s2+s3;
}
p=(structstudent*)malloc(size);
strcpy(p->num,num);
strcpy(p->name,name);
p->s1=s1;
p->s2=s2;
p->s3=s3;
p->s=s;
p->next=NULL;
if(head==NULL)
{
head=p;
}
else
{
tail->next=p;
}
tail=p;
COUNT++;
}
printf("新创建学生信息如下:
\n");
returnhead;
}
voidprint(structstudent*head)
{
structstudent*ptr;
if(head==NULL)
{
printf("\n没有学生信息。
\n");
return;
}
printf("\n学号姓名语文成绩数学成绩英语成绩总分\n");
for(ptr=head;ptr!
=NULL;ptr=ptr->next)
{
printf("%s%s%d%d%d%d\n",ptr->num,ptr->name,ptr->s1,ptr->s2,ptr->s3,ptr->s);
}
}
voidfail(structstudent*head)
{
structstudent*p=NULL;
intt=0;
if(head==NULL)
{
printf("没有学生信息\n");
return;
}
printf("不及格学生信息如下:
\n");
printf("学号姓名语文成绩数学成绩英语成绩总分\n");
for(p=head;p!
=NULL;p=p->next)
{
if((p->s1<60)||(p->s2<60)||(p->s3<60))
{
printf("%s%s%d %d%d%d\n",p->num,p->name,p->s1,p->s2,p->s3,p->s);
t++;
}
}
if(t==0)
printf("学生全部及格\n");
}
voidsearch(structstudent*head,char*num1)
{
structstudent*ptr;
intflag=0;
if(head==NULL)
{
printf("\n没有学生信息。
\n");
return;
}
for(ptr=head;ptr!
=NULL;ptr=ptr->next)
{
if(strcmp(ptr->num,num1)==0)
{
flag=1;
break;
}
}
if(flag)
{
printf("该学号的信息已查询到,如下所示:
\n");
printf("\n学号姓名语文成绩数学成绩英语成绩总分\n");
printf("%s%s%d%d%d%d\n",ptr->num,ptr->name,ptr->s1,ptr->s2,ptr->s3,ptr->s);
}
else
{
printf("该学号不存在。
\n");
}
}
structstudent*Delet(structstudent*head,char*num)
{
structstudent*ptr1,*ptr2;
intt=0;
for(ptr1=head;ptr1!
=NULL;ptr1=ptr1->next)
{
if(strcmp(ptr1->num,num)==0)
t++;
}
if(t==0)
{
printf("需要删改的学生信息不存在:
\n");
returnhead;
}
if(head!
=NULL&&strcmp(head->num,num)==0)
{
ptr2=head;
head=head->next;
free(ptr2);
}
if(head==NULL)
{
returnNULL;
}
ptr1=head;
ptr2=head->next;
while(ptr2!
=NULL)
{
if(strcmp(ptr2->num,num)==0)
{
ptr1->next=ptr2->next;
free(ptr2);
}
else
{
ptr1=ptr2;
}
ptr2=ptr1->next;
}
printf("修改后的学生信息如下:
\n");
returnhead;
}
structstudent*Insert(structstudent*head,structstudent*stud)
{
structstudent*ptr,*ptr1,*ptr2;
intflag=0;
ptr2=head;
ptr=stud;
if(head==NULL)
{
head=ptr;
head->next=NULL;
returnhead;
}
else
{
for(;ptr2!
=NULL;ptr2=ptr2->next)
{
if(strcmp(ptr2->num,stud->num)==0)
{
flag=1;
break;
}
}
if(flag==1)
{
printf("输入的学号已经存在,请重新操作。
\n");
}
else
{
ptr2=head;
printf("执行了flag=0\n");
while((strcmp(ptr->num,ptr2->num)>0)&&(ptr2->next!
=NULL))
{
ptr1=ptr2;
ptr2=ptr2->next;
}
if(strcmp(ptr->num,ptr2->num)<=0)
{
if(head==ptr2)
{
head=ptr;
}
else
{
ptr1->next=ptr;
}
ptr->next=ptr2;
}
else
{
ptr2->next=ptr;
ptr->next=NULL;
}
}
printf("修改后的学生信息如下:
\n");
returnhead;
}
}
五、实验总结:
在试验中对于程序整体的把握能力不够,在一些细节的地方做的不好,通过这次实验让我对
链表有了更加深刻的认识。