前段时间学习链表,编一个学生管理系统,欢迎指正

本文介绍了一个使用C语言实现的学生信息管理系统,通过链表来存储和管理学生数据,包括创建链表、插入新数据、根据姓名删除记录以及显示所有学生信息等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



//编译预处理
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>

//自定义数据类型
typedef struct
{
 int num;
 char name[20];
 double score;
}STD;
typedef struct lnode
{
 STD data;
 struct lnode * next;
}lnode,*linklist;

//函数声明
int init(linklist *l);
int insert(linklist l,int i,STD x);
int dele(linklist l,int i,STD *x);
int nameloca(linklist l,char *name);
int disp(linklist l);
int menu();

//主函数
void main()
{
 int n,m,i=0;
 STD x;
 linklist l,p;
 while(1)
 {
  n=menu();
  switch(n)
  {

   //创建链表
  case 1:
   char yn;
   init(&l);
   do
   {
    i++;
    printf("请输入第%d个学生信息:",i);
    scanf("%d%s%lf",&x.num ,x.name ,&x.score );
    getchar();
    p=new lnode;
    p->data =x;
    insert(l,i,x);
    printf("继续输入吗?Y/N:");
    yn=getchar();
   }while(yn=='Y'||yn=='y');
   printf("按任意键继续!\n");
   getch();
   break;

   //插入数据
  case 2:printf("请输入学生的学号、姓名、分数,用空格隔开\n");
      scanf("%d  %s  %lf",&x.num,x.name ,&x.score  );
   printf("请输入想要插入的位置:\n");
      scanf("%d",&n);
      insert(l,n,x);
   printf("按任意键继续!\n");
   getch();
   break;

   //根据学生姓名删除信息
  case 3:printf("请输入要删除学生的姓名:\n");
   char st[20];
   scanf("%s",st);
   n=nameloca(l,st);
   if(dele(l,n,&x))
   {
   printf("删除的学生数据为:\n");
   printf("%d  %s  %.2f\n",x.num ,x.name ,x.score );
   }
   printf("按任意键继续!\n");
   getch();
   break;

   //显示学生数据
  case 4:
   disp(l);
   printf("按任意键继续!\n");
   getch();
   break;
   //退出

  case 0:exit(0);
  }
 }
}
   
//
int init(linklist *l)
{
 *l=new lnode;
 if(*l==NULL)return 0;
 (*l)->next =NULL;
 return 1;
}
//
int insert(linklist l,int i,STD x)
{
 linklist p=l,s;
 int pos =0;
 while(p!=NULL&&pos<i-1){p=p->next ;pos++;}
 //p记住第i-1个节点,pos记住p指向节点的位置
 if(p==NULL||pos>i-1){printf("插入位置不合理\n");return 0;}
    //正常情况下pos==i-1
 s=new lnode;//生成新节点
 s->data =x;
 s->next =p->next ;
 p->next =s;
 return 1;
}

//
int dele(linklist l,int i,STD *x)
{
 linklist q,p=l;//p记住头节点
    int pos=0;
 while(p->next !=NULL&&pos<i-1){p=p->next ;pos++;}
 if(p->next ==NULL||pos>i-1){printf("链表为空或删除位置不合理\n"); return 0;}
 q=p->next ;
 p->next =q->next ;
 *x=q->data ;
 free(q);
 return 1;
}

//
int nameloca(linklist l,char *name)
{
 linklist p=l->next ;
 int n=1;
 while(p)
  if(strcmp(p->data .name ,name)){p=p->next ;n++;}
  else return n;
  if(p==NULL)
  return 0;
}

//
int disp(linklist l)
{
 linklist p=l->next ;
 if(p==NULL){printf("没有数据!\n");return 0;}
 while(p)
 {
  printf("%d  %s  %.2f\n",p->data .num ,p->data .name ,p->data .score );
  p=p->next ;
 }
 return 1;
}

//
int menu()
{
 int n;
 while(1)
 {
  printf("******欢迎使用新生成及管理系统******\n");
  printf("1.创建链表     2.插入新生数据\n");
  printf("3.删除数据     4.显示所有数据\n");
  printf("0.退出\n");
  printf("************************************\n");
  printf("请选择功能编号(0-4):\n");
  scanf("%d",&n);
  getchar();//吃回车
  if(n<0||n>4)
   printf("输入有误,重新选择,按任意键继续!\n");
  else return n;
 }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值