#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
typedef struct stu
{
int num; //学生的学号
char name[10]; //学生的姓名
float score; //学生的成绩
}STUDENT; //存放单个学生信息的结构体类型
typedef struct node
{
STUDENT data; //结点的值
struct node *next;//指向下一个结点的地址
}SNODE;
void showmenu()
{ //显示菜单
printf(" 欢迎使用成绩管理小软件\n");
printf("\t1、创建学生信息\n");
printf("\t2、插入学生信息\n");
printf("\t3、删除学生信息\n");
printf("\t4、显示学生信息\n");
printf("\t5、退出程序\n");
}
SNODE *listcreate(SNODE *head,int n) //n为该班级的实际人数
{ //建立班级学生信息
int i;
SNODE *p=NULL,*q=NULL;
p=head;
for(i=1;i<=n;i++) //循环插入n个学生
{
printf("\n请输入第%d位学生的信息:\n",i);
q=(SNODE *)malloc(sizeof(SNODE));
printf("学号=");scanf("%d",&q->data.num);
printf("姓名=");scanf("%s",q->data.name);
printf("成绩=");scanf("%f",&q->data.score);
q->next=NULL;
p->next=q;
p=q;
head->data.num++;
}
return head;
}
//学生结点的插入
SNODE * listinsert(SNODE * pHead,int pos)
{
SNODE * cur = NULL;
SNODE * prev = pHead;
int i;
cur = (SNODE * )malloc(sizeof(SNODE));
if(NULL == cur)
{
printf("动态内存分配失败!\n");
exit(-1);
}
else
{
while(pos<1||pos>pHead->data.num+1)
{
printf("插入的位置非法,请从新输入!\n");
printf("有效插入位置为1至班级学生人数+1!\n");
scanf("%d",&pos);
}
printf("请输入学生信息:\n");
printf("学号=");
scanf("%ld",&cur->data.num);
printf("姓名=");
scanf("%s",cur->data.name);
printf("分数=");
scanf("%f",&cur->data.score);
for(i = 1;i<pos;i++)
{
prev = prev->next;
}
if(prev->next==NULL)
{
prev->next = cur;
cur->next = NULL;
pHead->data.num ++;
}
else
{
cur->next = prev ->next;
prev->next = cur;
pHead->data.num++;
}
}
return pHead;
}
//学生结点的删除
SNODE * listdel(SNODE * pHead,int pos)
{
SNODE * prev;
SNODE * cur;
int i;
prev = pHead;
while(pos<1||pos>pHead->data.num)
{
printf("您的输入有误,请从新输入!\n");
printf("有效删除位置为1至班级学生人数!\n");
scanf("%d",&pos);
}
for(i = 1;i<pos;i++)
{
prev = prev->next;
}
cur = prev->next;
if(NULL == cur->next )
{
prev->next = NULL;
free(cur);
pHead->data.num--;
}
else
{
prev->next = cur->next;
free(cur);
pHead->data.num--;
}
return pHead;
}
void listdisplay(SNODE *head)
{
//显示所有学生信息
SNODE *p;
p=head->next;
printf("班级学生信息如下:\n");
printf(" 学号 姓名 成绩\n");
while(p!=NULL)
{
printf("%10d%10s%10.2f\n",p->data.num,p->data.name,p->data.score);
p=p->next;
}
return;
}
void main()
{
SNODE *head=NULL;
int no,stu_count,pos;
head=(SNODE *)malloc(sizeof(SNODE));//动态建立第一个结点,作为头结点,head指针指向它,
head->data.num=0; //链表为带头结点的单链表
head->next=NULL;
while(1)
{
showmenu();
printf(" 请输入你的选择:");
scanf("%d",&no);
switch(no)
{
case 1: printf("班级信息初始化,按任意键继续……\n");
getch();
printf("请输入班级学生原始人数:");
scanf("%d",&stu_count);
head=listcreate(head,stu_count);
system("cls");
showmenu();
listdisplay(head);
printf("班级信息初始化已经完成,按任意键继续……\n");
getch();
system("cls");
break;
case 2:printf("插入前班级信息:\n");
listdisplay(head);
printf("请输入插入位置:");
scanf("%d",&pos);
head=listinsert(head,pos);
printf("插入后班级信息:\n");
listdisplay(head);
printf("插入已经完成,按任意键继续……\n");
getch();
system("cls");
break;
case 3:printf("删除前班级信息:\n");
listdisplay(head);
printf("请输入删除位置:");
scanf("%d",&pos);
head=listdel(head,pos);
printf("删除后班级信息:\n");
listdisplay(head);
printf("删除已经完成,按任意键继续……\n");
getch();
system("cls");
break;
case 4:listdisplay(head);
printf("显示结果如上所示,按任意键继续……\n");
getch();
system("cls");
break;
case 5:return;
}
}
}
成绩管理小软件
最新推荐文章于 2018-12-23 13:21:25 发布