学生信息管理系统

 

//学生信息管理链表实现

#include"stdio.h"
#include"string.h"
#include"stdlib.h"

struct student
{
 int number;
 char name[20];
 int score;
 struct student *next;
};

/*函数的声明*/
struct student *crease();//新建链表
struct student *insert(struct student *head,struct student *p);//插入操作
struct student *dele(struct student *head,int number);//删除操作
void print(struct student *head);//输出函数
struct student *dele1(struct student *head);

int size=sizeof(struct student);

int main(void)
{
 struct student *head=NULL,*p;
 int choice,number; 
 int flag=1;
 while(flag){ 
  printf("Please choice:\n 1:crease  2:insert  3:delet  4:print 5:dele1 0:Exit !!!\n");
  printf("choice:");
  scanf("%d",&choice);
  switch(choice){
    case 1 :
       head=crease();//函数调用新建链表
       flag=1;
       break;
    case 2 :
             p=(struct student *)malloc(size);
     
             printf("please input number name and score:\n ");
       scanf("%d%s%d",&p->number,p->name,&p->score);
       head=insert(head,p);//插入函数
       flag=1;
       break;
    case 3 :
       printf("Input number:");
       scanf("%d",&number);
       head=dele(head,number);//函数调用删除操作
       flag=1;
       break;
    case 4 :
       print(head);//函数调用输出函数
       flag=1;
       break;
    case 5 :
       head=dele1(head);
       flag=1;
            break;
    case 0 :
       flag=0;
       break;
    default:
       break;     
    }//switch
  if(flag==0)
   printf("Thank you !!!\n");
 }//while
return 0;
}//main

 

 

/*函数定义*/
//新建链表方式1
/*
struct student *crease()
{
 struct student *head,*tail,*p;
 
 int size=sizeof(struct student);

 head=NULL;
 p=(struct student *)malloc(size);
 printf("please input number,name and score:\n");
 scanf("%d%s%d",&p->number,p->name,&p->score);

 while(p->number!=0){

  p->next=NULL;
        if(head==NULL)
   head=p;
  else
   tail->next=p;
   
  tail=p;
  p=(struct student *)malloc(size);
  printf("please input number,name and score:\n");
  scanf("%d%s%d",&p->number,p->name,&p->score);
 }//while
   
 return head;
}

 

//新建链表方式2  (这里的p2指针就相当于上面的tail指针)其实也是一样的
struct student *crease()
{
 
 struct student *head;
 struct student *p1,*p2;

 head=NULL;
 p1=p2=(struct student *)malloc(size);
 printf("Please enter number,name and score:\n");
 scanf("%d%s%d",&p1->number,p1->name,&p1->score);
 while(p1->number!=0)
 { 
  if(head==NULL)
   head=p1;
  else
   p2->next=p1;
  p2=p1;

  p1=(struct student *)malloc(size);
  //printf("Please enter number name and score:\n");
  scanf("%d%s%d",&p1->number,p1->name,&p1->score);
 }
 p2->next=NULL;
 return head;


}

*/


//新建链表3  无序输入有序输出

struct student *crease()
{
 struct student *head;
 struct student *p;
 int number,score;
 char name[20];

 head=NULL;
 printf("please input number,name and score:\n");
 scanf("%d%s%d",&number,name,&score);
 while(number!=0)
 {
  p=(struct student*)malloc(size);
  p->number=number;
  strcpy(p->name,name);
  p->score=score;
  head=insert(head,p);
  scanf("%d%s%d",&number,name,&score);
 }
 return head;
}

 

//插入操作
struct student *insert(struct student *head,struct student *p)
{
 struct student *pr,*pr1,*pr2;
 pr2=head;
 pr=p;
 if(head==NULL)
 {
  head=pr;
  pr->next=NULL;
 }
 else
 {
  while((pr->number>pr2->number)&&(pr2->next!=NULL))
   {
    pr1=pr2;
    pr2=pr2->next;
   }
  if(pr->number<=pr2->number)
  {
   if(pr2==head)
    head=pr;

   else
    pr1->next=pr;
   pr->next=pr2;
  }
  else
  {
   pr2->next=pr;
   pr->next=NULL;
  }
 }

 return head;
}

 

 

 

//删除操作
struct student *dele(struct student *head,int number)
{
 struct student *p1,*p2;
 p1=head;
 if(head==NULL)
  printf("No records!!!\n");

 else
 {

  while((number!=p1->number)&&(p1->next!=NULL))
   {
    p2=p1;
    p1=p1->next;
   }
  if(p1->number==number)
  {
   if(p1==head)
   {
    head=p1->next;
    free(p1);
   }
   else
   {
    p2->next=p1->next;
    free(p1);
   }
 
  }
  else
   printf("No records!!!\n");
 }
 return head;

}

 


//输出函数
void print(struct student *head)
{
 struct student *pr;
 if(head==NULL)
   {
    printf("\n No Records!!! \n");
    //return;
   }
 else
  {
   printf("The student's records are:\n");
   for(pr=head;pr;pr=pr->next)
   printf("%d  %s  %d\n",pr->number,pr->name,pr->score);
  }
}

 


/*
//删除成绩为60分以下的记录1
struct student *dele1(struct student *head)
{
 struct student *p;
 for(p=head;p;p=p->next)
  if(p->score<60)
   head=dele(head,p->number);

 return head;
}
*/


//删除成绩为60分以下的记录2
struct student *dele1(struct student *head)
{
 struct student *p;
 int flag=1;
 while(flag)
 { 
  for(p=head;p;p=p->next)
  {
   if(p->score<60)
   {
    head=dele(head,p->number);
    flag=1;
    break;
   }
  }

  if(p==NULL)
   flag=0;
 }

 return head;
}

 


/*
//删除成绩为60分以下的记录3
struct student *dele1(struct student *head)
{
 struct student *p1,*p2;
 int flag=1;
 p2=head;

 if(head==NULL)
  printf("No recoreds!!!\n");
 else
 {
  while(flag)
  {
   while((p2->number>=60)&&(p2->next!=NULL))
   {
    p1=p2;
    p2=p2->next;
   }
   if(p2->number<60)
   {
    if(p2==head)
    {
     head=p2->next;
     p2=head;
    }
    else
    {
     p1->next=p2->next;
     p2=p1->next;
    }
    flag=1;
   }
   else
   {
    printf("No records!!!\n");
    flag=0;
   }
  }//while
 }//else

 return head;
}

*/

//删除成绩为60分以下的记录4

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值