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();
  }
 
}

原文地址:https://www.cnblogs.com/doublekai/p/6651296.html