• c语言单链表学生系统(注释太少,有问题请私聊 谢谢!)


    #include "stdio.h"
    #include "malloc.h"
    #include "stdlib.h"
    #include "string.h"
    typedef struct
    {
     int no;
     char name[10];
     char sex;
    }Student;
    typedef struct Node
    {
     Student data;   //数据域
     struct Node *next;  //指针域
    }Node,*LinkList;
    LinkList  create_LinkLast(LinkList L)
    {
     L=(LinkList)malloc(sizeof(Node));/*申请内存*/

        L->next=NULL;/*建立空的单链表*/
        return L; 
       
    }

    int getNo(LinkList L)//输入姓名
     {
      
        int no;
         while(1)
         {
       printf("请输入学号1000-9999:");
          scanf("%d",&no);
          if(no>1000&&no<9999)break;
       printf("输入错误! ");
      }
      
     return 0;
    }
    char getSex()    //输入性别
    {
      char sex;
      while(1){
        fflush(stdin);
        printf("请输入性别(M或F):");
        scanf("%c",&sex); 
        if(sex=='M'||sex=='m'||sex=='f'||sex=='F')
           break;
        else
          printf("输入错误,您只能输入字符M(男)或者F(女)! ");      
      }
      return sex;
     }
    Student getStudent(LinkList L)//数据输入
    {
     Student s1;
     s1.no = getNo(L);
     printf("请输入姓名:");
     scanf("%s",s1.name);
     s1.sex = getSex();
     return s1;
    }
    void add_Head(LinkList L) //尾部添加
    {  
     
     Node *p;
     p= (LinkList)malloc(sizeof(Node));
     p->data= getStudent(L);
     p->next =L->next;
     L->next = p;
     printf("添加成功!");
     
     
     
       
    }
    show_LinkList(LinkList L) //显示
    {
      printf(" 1.全部显示 ");
      printf(" 2.按学号升序显示 ");
      printf(" 3.返回 ");
      Node *PL ,*p=L;//找到首节点
         Student temp;
         int flag=0,i;
         PL=L;
       scanf("%d",&i);
      if(i==1)
      {
       while(PL->next)
       {
        PL=PL->next;
         if(flag==0)
         {
           system("cls");
           printf(" ****************     全部显示     **************** ");
           printf(" | 学号 | 姓名 | 性别 | ");
         }
       printf(" | %d | %s | %c | ",PL->data.no,PL->data.name,PL->data.sex);
       flag++;
       }
       if(flag==0)printf("没有数据!");
      }
     else if(i==2)
     {
      while(PL->next->next)
      {
        
         if(PL->next->data.no>PL->next->next->data.no)
         {
          temp = PL->next->data;
          PL->next->data = PL->next->next->data;
        PL->next->next->data = temp;
         }
         PL = PL->next;
      }
      while(p->next)
       {
       p=p->next;
         if(flag==0)
         {
           system("cls");
           printf(" ****************     全部显示     **************** ");
           printf(" | 学号 | 姓名 | 性别 | ");
         }
       printf(" | %d | %s | %c | ",p->data.no,p->data.name,p->data.sex); 
       
       flag++;
      
       }
       if(flag==0)printf("没有数据!");
     }

      
    }
    Node *getprior(LinkList L,Node *r)
    {
     Node *p=L;
     while(p->next!=r)
     {
      p=p->next;
     }
     return p;
     
    }
    delete_LinkList(LinkList L)   //删除节点
    {
     printf(" 1.学号删除信息 ");
     printf(" 2.姓名删除信息 ");
     printf(" 3.位置删除信息 ");
     printf(" 4.返回 ");
     int a,id,j=0;
     char ch,ch_name[10];
     Node *p=L,*r;
     Student e;
     scanf("%d",&a);
     if(a==1)
     {
      printf("请输入学号: ");
       scanf("%d",&id);
       while(p->next)
       { 
        p=p->next;
       if(p->data.no==id)
        {
         printf(" | %d | %s | %c | ",p->data.no,p->data.name,p->data.sex);         
        fflush(stdin);
        printf("确定删除y or n? ");
        scanf("%c",&ch);
        if(ch=='y'||ch=='Y')
        {
         r=getprior(L,p);
         r->next=p->next;
         free(p);
         printf("删除成功"); 
        
        }
      
       
       }
       
      }
     }
     else if(a==2)
     {
       printf("请输入姓名: ");
       scanf("%s",ch_name);
       while(p->next)
       { 
        p=p->next;
       if(strcmp(p->data.name,ch_name)==0)
        {
         printf(" | %d | %s | %c | ",p->data.no,p->data.name,p->data.sex);         
        fflush(stdin);
        printf("确定删除y or n? ");
        scanf("%c",&ch);
        if(ch=='y'||ch=='Y')
        {
         r=getprior(L,p);
         r->next=p->next;
         free(p);
         printf("删除成功"); 
        
        }
      
       
       }
       
      }
     }
     else if(a==3)
     {
       printf("请输入位置: ");
       scanf("%d",&id);
       while(p->next&&j<id-1&&id>0)
       {
        p=p->next;
        j++;
      }
      if(p->next==NULL||j>id-1)
      {printf("输入位置有错! ");return 0;}
      
        printf(" | %d | %s | %c | ",p->next->data.no,p->next->data.name,p->next->data.sex);
       fflush(stdin);
       printf("确定删除y or n? ");
       scanf("%c",&ch);
       if(ch=='y'||ch=='Y')
       {
       
        r=p->next;
        p->next=p->next->next;
        e=r->data;
        free(r);
        printf(" 删除成功!");
       }

     }
     else return 0;
    }
    void opan_LinkList(LinkList L)   //读取学生信息
    {
     FILE *fp;
     Node *s,*p=L;
     if((fp=fopen("linklist.txt","rb"))==NULL)
     {
      printf("打开文件失败! ");
      system("pause");
      exit(1);
     }
     s=(Node *)malloc(sizeof(Node));
     while(fread(&(s->data),sizeof(Student),1,fp)==1)
     {
      p->next=s;
      s->next=NULL;
      p=p->next ;
      s=(Node *)malloc(sizeof(Node));
     }                       
     fclose(fp); 
    }
    int save_LinkList(LinkList L)   //保存学生信息
    {
        FILE *fp;
        Node *p=L;
        int i;
        if((fp=fopen("linklist.txt","wb"))==NULL)
        {
         printf("打开文件失败 ");
        }
            while(p->next)
            {  
             p= p->next;
                fwrite(&(p->data), sizeof(Student), 1, fp);
                
            }

        fclose(fp);
    }
    Node *getrear(LinkList L) //得到节点尾部的地址
    {
     struct Node *p;
     p=L;
     while(p->next)
     {
      p=p->next;
     }
     return p;
    }
    add_rear(LinkList L)//在尾部添加节点
    {
      Node *p,*r;
     p=(LinkList)malloc(sizeof(Node));
     p->data=getStudent(L);
     printf("添加成功!");
     r=getrear(L);
     p->next=r->next;//r->next=NULL;
     r->next=p;
     
    }
    Node *middle(LinkList L)
    {
     int flag=0,id;
     Node *p=L;
     char ch;
      printf("请输入学生学号: ");
       scanf("%d",&id);
     while(p->next)
       {
        p=p->next;
        if(id==p->data.no)
        {
         
           flag++;
           system("cls");
         printf(" | %d | %s | %c | ",p->data.no,p->data.name,p->data.sex);
         printf("确定插入y/n ");
         fflush(stdin);
         scanf("%c",&ch);
         if(ch=='y'||ch=='Y')
         {
           return p;
         }
         else return 0;
      }
     
      
       }
       if(flag==0)
       {
        printf("无法查到!自动添加到表尾: ") ;
        p= getrear(L);
        return(p);
       }
    }
    add_middle(LinkList L) //中间插入
    {
       Node *s,*p;
       char ch;
       p=(LinkList)malloc(sizeof(Node));
       s=middle(L);
       p->next=s->next;
       s->next=p;
       p->data=getStudent(L);
      
    }
     find(LinkList L)
    {
     printf(" 1.学号查找信息 ");
     printf(" 2.姓名查找信息 ");
     printf(" 3.位置查找信息 ");
     printf(" 4.返回 ");
     int i,id,flag=0,j=0;
     Node *p=L;
     char ch_name[10];
     scanf("%d",&i);
     if(i==1)
     {
      printf("请输入学号: ");
      scanf("%d",&id);
       while(p->next)
       { 
        p=p->next;
       if(p->data.no==id)
        {
           printf(" | %d | %s | %c | ",p->data.no,p->data.name,p->data.sex);
          flag++;
       }
      }
     }
     
     else if(i==2)
     {
      printf("请输入姓名: ");
       scanf("%s",ch_name);
       while(p->next)
       { 
        p=p->next;
       if(strcmp(p->data.name,ch_name)==0)
        {
         printf(" | %d | %s | %c | ",p->data.no,p->data.name,p->data.sex);        
         flag++;
        }
        if(flag==0)printf("姓名为%s的学生信息不存在!",ch_name);
      }
     }
     else if(i==3)
     {
       printf("请输入位置: ");
       scanf("%d",&id);
       while(p->next&&j<id-1&&id>0)
       {
        p=p->next;
        j++;
       }
      if(p->next==NULL||j>id-1)
      {
       printf("输入位置有错! ");return 0;
      }
      
      printf(" | %d | %s | %c | ",p->next->data.no,p->next->data.name,p->next->data.sex);
     }
    }
    Modify_LinkList(LinkList L)
    {
     printf(" 1.学号修改 ");
     printf(" 2.姓名修改 ");
     printf(" 3.性别修改 ");
     printf(" 4.返回 ");
     int a,id,flag=0;
     char ch,ch_name[10],ch__name[10];
     Node *p=L;
     scanf("%d",&a);
     if(a==1)
     {
      printf("请输入学号: ");
      scanf("%d",&id);
       while(p->next)
       { 
        p=p->next;
       if(p->data.no==id)
        {
           printf(" | %d | %s | %c | ",p->data.no,p->data.name,p->data.sex);
          flag++;
          break;
       }
      }
      if(flag==0)
      {
       printf("学号为%d的学生信息不存在!",id);return 0;
      }
      printf("确定修改y/n? ");
         fflush(stdin);
         scanf("%c",&ch);
         if(ch=='y'||ch=='Y')
         {
           p->data.no=getNo(L);
         }
         else return 0;
     }
     else if(a==2)
     {
      printf("请输入修改的姓名: ");
       scanf("%s",ch_name);
       while(p->next)
       { 
        p=p->next;
       if(strcmp(p->data.name,ch_name)==0)
        {
         printf(" | %d | %s | %c | ",p->data.no,p->data.name,p->data.sex);        
         flag++;
         break;
        }
      }
      if(flag==0)
      {
       printf("姓名为%s的学生信息不存在!",ch_name);return 0;}
      printf("确定修改y/n? ");
         fflush(stdin);
         scanf("%c",&ch);
         if(ch=='y'||ch=='Y')
         {
           printf("请输入姓名:");
         scanf("%s",ch__name);
         strcpy(p->data.name,ch__name);
         printf(" 修改成功! ");
         }
         else return 0;
     }
     else if(a==3)
     {
      
      printf("请输入学号: ");
      scanf("%d",&id);
       while(p->next)
       { 
        p=p->next;
       if(p->data.no==id)
        {
           printf(" | %d | %s | %c | ",p->data.no,p->data.name,p->data.sex);
          flag++;
          break;
       }
      }
      if(flag==0)printf("学号为%d的学生信息不存在!",id);
      printf("确定修改y/n? ");
         fflush(stdin);
         scanf("%c",&ch);
         if(ch=='y'||ch=='Y')
         {
          p->data.sex=getSex();
         
         printf(" 修改成功! ");
         }
         else return 0;
     }
     
    }
    main()
    {
     LinkList L;
     int i,a;
     L=create_LinkLast(L);
     opan_LinkList(L); 
     while(1)
      {
       system("cls");
       printf(" ************************************ ");
       printf(" ******       学生系统         ****** ");
       printf(" ************************************ ");
       printf(" 1.添加学生信息 ");
       printf(" 2.显示学生信息 ");
       printf(" 3.插入学生信息 ");
       printf(" 4.删除学生信息 ");
       printf(" 5.查找学生信息 ");
       printf(" 6.修改学生信息 ");
       printf(" 7.保存数据 ");
       printf(" 8.退出 ");
       scanf("%d",&i);
       if(i==1)
       {
         add_Head(L);
       }
       else if(i==2)
       {
        system("cls");
         show_LinkList(L);
       }
       else if(i==3)
       {
        system("cls");
        printf(" 1.后面添加 ");
        printf(" 2.中间添加 ");
        printf(" 3.返回 ");
        scanf("%d",&a);
        if(a==1)add_rear(L);
        else if(a==2)
        {
          add_middle(L);
        }
       
       }
       else if(i==4)
       {
        system("cls");
        delete_LinkList(L);
       }
       else if(i==5)
       {
        system("cls");
        find(L);
       }
       else if(i==6)
       {
        system("cls");
        Modify_LinkList(L); 
       }
       else if(i==7)save_LinkList(L);
       else return 0;
       getch();
      }
     
    }

  • 相关阅读:
    javascript数据类型判断
    Week04面向对象设计与继承
    201621044079《Java程序设计》第1周学习总结
    201621044079 week05继承、多态、抽象类与接口
    201621044079《Java程序设计》第二周学习总结
    Week03面向对象入门
    201621044079WEEK06接口、内部类
    202020211 20209320 《Linux内核原理与分析》第一周作业
    第二天:PowerShell别名
    第一天:powershell外部命令
  • 原文地址:https://www.cnblogs.com/doublekai/p/6651296.html
Copyright © 2020-2023  润新知