#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct stu
{
char name[20]; //姓名
char num[20]; //学号(可包含字母)
int age; //年龄
float score; //分数
struct stu *next; //下个节点
}STU;
//创建含有n个学生信息的链表,返回链表头结点
STU* Creat_StudentInfo_1(int n); //头插法
STU* Creat_StudentInfo_2(int n); //尾插法
//计算链表节点个数(学生个数)
int Calculate_Studentnum(STU* head);
//链表的插入:头部插入、指定位置插入、尾部插入
STU* Insert_StudentInfo_1(STU* head); //在头部插入新节点
STU* Insert_StudentInfo_2(STU* head, int n); //在第n个位置上插入新节点
STU* Insert_StudentInfo_3(STU* head); //在尾部插入新节点
//节点的删除
void Delet_StudentInfo(STU* head, char name[]);//删除学生信息
//查询节点
STU* Search_StudentInfo(STU* head, char name[]);//根据名字查询,返回节点地址
//遍历链表并输出学生信息
void Printf_StudentInfo(STU* head);
void Delet_AllStudentInfo(STU* head);//删除所有节点
int main(void)
{
int num=0,Index=0;
char name[20]="";
STU* Head=(STU*)malloc(sizeof(STU));
Head->next=NULL;
while(1)
{
printf("\n");
printf("**********学生信息系统**********\n");
printf("1-创建学生信息 2-查询学生信息\n");
printf("3-插入学生信息 4-删除学生信息\n");
printf("5-打印学生信息 6-删除所有信息\n");
printf("0-退出系统\n");
printf("********************************\n");
printf("请输入功能索引(0-6):");
scanf("%d",&Index);
printf("\n");
switch(Index)
{
case 0:
printf("退出成功!");
break;
case 1:
printf("请输入待录入学生数量:");
scanf("%d",&num);
Head=Creat_StudentInfo_2(num);//尾插法输入学生信息
break;
case 2:
printf("请输入要查询的学生名字:");
scanf("%s",name);
Search_StudentInfo(Head,name);
break;
case 3:
Insert_StudentInfo_3(Head);//尾部插入信息
break;
case 4:
printf("请输入要删除的学生名字:");
scanf("%s",name);
Delet_StudentInfo(Head,name);
break;
case 5:
Printf_StudentInfo(Head);// 打印学生信息
break;
case 6:
Delet_AllStudentInfo(Head);
break;
}
if(Index==0)break;
}
return 0;
}
//创建链表(头指针->首元节点->...->表尾节点)
//头插法:在单链表的头部插入新的结点的方法称为头插法
STU* Creat_StudentInfo_1(int n)
{
if(n<=0)
{
printf("创建失败!\n");
return;
}
int i,j;
STU *Head,*ps;//头指针 新加节点
Head=(STU*)malloc(sizeof(STU));//头指针
Head->next=NULL;//头指针指向首元节点(空)
for(i=0;i<n;i++)
{
ps=(STU*)malloc(sizeof(STU));//为新节点申请内存
printf("请输入学生的以下信息:\n");
for(j=0;j<4;j++)
{
if(j==0)
{
printf("姓名:");
scanf("%s",ps->name);
}
else if(j==1)
{
printf("学号:");
scanf("%s",ps->num);
}
else if(j==2)
{
printf("年龄:");
scanf("%d",&ps->age);
}
else if(j==3)
{
printf("分数:");
scanf("%f",&ps->score);
}
}
printf("\n");
//头插法创建链表
ps->next=Head->next; //新节点指向首元结点
Head->next=ps;//移动头结点
}
printf("创建成功!\n");
return Head;
}
//尾插法:在单链表的尾部插入新的结点的方法称为尾插法
STU* Creat_StudentInfo_2(int n)
{
if(n<=0)
{
printf("创建失败!\n");
return;
}
int i,j;
STU *Head,*Tail,*np;//头指针 尾指针 新加节点
Head=(STU*)malloc(sizeof(STU));//头指针
Head->next=NULL;//头指针的指针域指向空
Tail=Head;
for(i=0;i<n;i++)
{
np=(STU*)malloc(sizeof(STU));//为新节点申请内存
printf("请输入学生的以下信息:\n");
for(j=0;j<4;j++)
{
if(j==0)
{
printf("姓名:");
scanf("%s",np->name);
}
else if(j==1)
{
printf("学号:");
scanf("%s",np->num);
}
else if(j==2)
{
printf("年龄:");
scanf("%d",&np->age);
}
else if(j==3)
{
printf("分数:");
scanf("%f",&np->score);
}
}
printf("\n");
//尾插法创建链表
Tail->next=np;//尾结点指向新节点
Tail=np;//移动尾结点
}
np->next=NULL;
printf("创建成功!\n");
return Head;
}
//计算链表节点个数(学生个数)
int Calculate_Studentnum(STU* head)
{
STU* np=head->next;
int result=0;
while(np!=0)
{
result++;
np=np->next;
}
return result;
}
//链表的插入:头部插入、指定位置插入、尾部插入
STU* Insert_StudentInfo_1(STU* head)//在头部插入新节点
{
STU* np=(STU*)malloc(sizeof(STU));//为新节点申请内存
printf("请输入学生的以下信息:\n");
printf("姓名:");
scanf("%s",np->name);
printf("学号:");
scanf("%s",np->num);
printf("年龄:");
scanf("%d",&np->age);
printf("分数:");
scanf("%f",&np->score);
printf("\n");
np->next=head->next;
head->next=np;
printf("插入成功!\n");
return head;
}
STU* Insert_StudentInfo_2(STU* head, int n)//在第n个位置上插入新节点
{
if(n<=0)
{
printf("插入失败!\n");
return head;
}
STU* p=head,*np=(STU*)malloc(sizeof(STU));//为新节点申请内存
int i=0;
while(i<n-1 && p->next!=NULL)//找到第n-1个节点(如果超过最大节点数,就在尾部插入新节点)
{
p=p->next;
i++;
}
printf("请输入学生的以下信息:\n");
printf("姓名:");
scanf("%s",np->name);
printf("学号:");
scanf("%s",np->num);
printf("年龄:");
scanf("%d",&np->age);
printf("分数:");
scanf("%f",&np->score);
printf("\n");
np->next=p->next;
p->next=np;
printf("插入成功!\n");
return head;
}
STU* Insert_StudentInfo_3(STU* head)//在尾部插入新节点
{
STU* tail=head,*np=(STU*)malloc(sizeof(STU));//为新节点申请内存
while(tail->next!=NULL)
{
tail=tail->next;
}
printf("请输入学生的以下信息:\n");
printf("姓名:");
scanf("%s",np->name);
printf("学号:");
scanf("%s",np->num);
printf("年龄:");
scanf("%d",&np->age);
printf("分数:");
scanf("%f",&np->score);
printf("\n");
tail->next=np;
np->next=NULL;
printf("插入成功!\n");
return head;
}
void Delet_StudentInfo(STU* head, char name[])
{
STU* p=head,*q;//临时节点 要删除的节点
int i=0;
while(p!=NULL)
{
if(strcmp(p->name,name)==0)//字符串一样,返回0,不一样返回非0
{
break;
}
else
{
p=p->next;
}
}
if(p==NULL)
{
printf("删除失败!\n");
}
else
{
q=p->next;
p->next=q->next;
free(q);
printf("删除成功!\n");
}
}
//查询节点
STU* Search_StudentInfo(STU* head, char name[])//根据名字查询,返回节点地址
{
STU* p=head;
while(p!=NULL)
{
if(strcmp(p->name,name)==0)//字符串一样,返回0,不一样返回非0
{
printf("已查询到该学生信息!\n");
printf("**********学生信息如下**********\n");
printf("*姓名*\t*学号*\t*年龄*\t*分数*\t\n");
printf("%s\t%s\t%d\t%.2f\n",p->name,p->num,p->age,p->score);
printf("********************************\n");
break;
}
else
{
p=p->next;
}
}
if(p==NULL)
{
printf("没有查询到该学生的信息!\n");
}
return p;
}
void Delet_AllStudentInfo(STU* head)//删除所有节点
{
STU* q;
while(head->next!=NULL)
{
q=head->next;
head->next=q->next;
free(q);
}
head->next=NULL;
printf("已删除所有信息!\n");
}
//遍历链表,打印结果
void Printf_StudentInfo(STU* head)
{
STU* temp=head->next;
printf("**********学生信息如下**********\n");
printf("*姓名*\t*学号*\t*年龄*\t*分数*\t\n");
while(temp!=NULL)
{
printf("%s\t%s\t%d\t%.2f\n",temp->name,temp->num,temp->age,temp->score);
temp=temp->next;
}
printf("总人数:%d\n",Calculate_Studentnum(head));
printf("********************************\n");
}
学生信息系统.zip11111111
需积分: 1 118 浏览量
2023-10-13
11:02:05
上传
评论
收藏 2KB ZIP 举报
lossmyself
- 粉丝: 1
- 资源: 11
最新资源
- 测试aaaaaaabbbbb
- VID20240521070643.mp4
- Android系统原理与开发学习要点详解-培训课件.zip
- 部署yolov8的tensorrt模型支持检测分割姿态估计的C++源码+部署步骤.zip
- 以简单、易用、高性能为目标、开源的时序数据库,支持Linux及Windows, Time Series Database.zip
- python-leetcode面试题解之第198题打家劫舍-题解.zip
- python-leetcode面试题解之第191题位1的个数-题解.zip
- python-leetcode面试题解之第186题反转字符串中的单词II-题解.zip
- 一个基于python的web后端高性能开发框架,下载可用
- python-leetcode面试题解之第179题最大数-题解.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈