学生管理系统 链表实现

#include
#include
typedef struct NODE
{
    int ID;
    char name[100];
    int score[3];
    struct NODE *next;
}LNODE,*LINKLIST;

void InitList(LINKLIST *L);
LNODE * CreatNode();
void PriList(LNODE *head);
LNODE * InsertNode(LNODE *head,int n);
LNODE * DelNode(LNODE *head,int n);
LNODE * FindNode(LNODE *head,int ID);
LNODE * SortNode(LNODE *head);
int MenuSelect();
int main(void)
{
    LNODE *head;
 int m;
    int ID;
 int choice;
 InitList(&head);
 while((choice=MenuSelect())!='9')
 {
 switch(choice)
 {
 case 1:
        head=CreatNode();
  break;
 case 2:
     PriList(head);
  break;
 case 3:
  printf("输入你要查找的节点:");
  scanf("%d",&ID);
      putchar('\n');
  FindNode(head,ID); 
  break;
 case 4:
   printf("输入你要删除的节点:");
   scanf("%d",&m);
       putchar('\n');
   head=DelNode(head,m);
  break;
 case 5:
  head=SortNode(head);
  break;
 case 6:
  printf("输入你要插入的节点:");
  scanf("%d",&m);
  putchar('\n');
  InsertNode(head,m);
  break;
 case 7:
  
  break;
 case 8:
  
  break;
 case 9:
  exit(0);
  break;
 }
 }

}
int MenuSelect()
{
    int n;
    printf("*************************欢迎使用学生管理系统***********************************\n");
    printf("********************************MENU*********************************************\n");
    printf("\t\t\t1. 输入学生成绩记录 Enter the record\n"); /*输入学生成绩记录*/
    printf("\t\t\t2. 显示 Print the record\n"); /*显示*/
    printf("\t\t\t3. 寻找 Search record on name\n"); /*寻找*/
    printf("\t\t\t4. 删除 Delete a record\n"); /*删除*/
    printf("\t\t\t5. 排序 Sort to make new a file\n"); /*排序*/
    printf("\t\t\t6. 插入 Insert record to list\n"); /*插入*/
    printf("\t\t\t7. 保存 Save the file\n"); /*保存*/
    printf("\t\t\t8. 读取 Load the file\n"); /*读取*/
    printf("\t\t\t9. 退出 Quit\n"); /*退出*/
    printf("\n*********************Made by He Guo Ping.*************************************\n");
    do{
    printf("\n请输入你的选择Enter your choice(1~9):");
    scanf("%d",&n);
    }while(n<1||n>9); /*如果选择项不在1~9之间则重输*/
    return(n); /*返回选择项,主函数根据该数调用相应的函数*/
}

LNODE * CreatNode()
{
    int i;
 LNODE *p;
 LNODE *head=NULL;
 while(1)
 {
     p=(LNODE *)malloc(sizeof(LNODE));
  printf("输入学号Enter the num(0:list end):");
  scanf("%d",&p->ID);
  if(p->ID==0)
   break; /*如果学号首字符为0则结束输入*/
        printf("输入学生姓名:");
  scanf("%s",&(p->name));
  for(i=0;i<3;i++)
  {
      printf("输入第%d门课程成绩:",i+1);
      scanf("%d",&(p->score[i]));
  }
//  if(head=NULL)
 //           head=p;
  p->next=head;
  head=p;
 }
 return head;
}

void InitList(LINKLIST *L)
{
    (*L)=(LNODE *)malloc(sizeof(LNODE));
 (*L)->next=NULL;
}

void PriList(LNODE *head)
{
    LNODE *p;
 int pos=1;
 p=head; 
 while(p!= NULL)
 {  
        printf("************************************************************\n");
  printf("| ID | NAME  | ENGLISH | SHUXUE | YUWEN |\n");
  printf("| %d |  %s   |   %d    |   %d   |  %d   |\n",p->ID,p->name,p->score[0],p->score[1],p->score[2]);
  pos++;
  p=p->next;
 }
 printf("************************************************************\n");
}

LNODE * InsertNode(LNODE *head,int n)
{
    LNODE *p;
 LNODE *q;
 LNODE *s;
 int i;
 int j=1;
 s = (LNODE*)malloc(sizeof(LNODE));
 printf("输入学号Enter the num(0:list end):");
 scanf("%d",&s->ID);
    printf("输入学生姓名:");
    scanf("%s",&(s->name));
 for(i=0;i<3;i++)
 {
     printf("输入第%d门课程成绩:",i+1);
     scanf("%d",&(s->score[i]));
 }
 p=head;
 
 while(j<=n)
 {
     q=p;
  p=p->next;
  j++;
 }
 s->next=q->next;
 q->next=s;
 return head;
}
LNODE * DelNode(LNODE *head,int n)
{
    LNODE *p=NULL;
 LNODE *q=NULL;
 int i=1;
 p=head;
 while(i  {
  q=p;
  p=p->next;
  i++;
 }
 if(head==p)
 {
  head=p->next;
 }
 else
 {
 q->next=p->next;
 free(p);
 }
 printf("delete success\n");
 return head;
}
LNODE * FindNode(LNODE *head,int ID)
{
    LNODE *p;
 int i=1;
 p=head;
 while((p->ID != ID) && (p != NULL))
 {
  p=p->next;
 }
 printf("the information of the find student:\n");
 printf("************************************************************\n");
 printf("| ID | NAME  | ENGLISH | SHUXUE | YUWEN |\n");
 printf("| %d |  %s   |   %d    |   %d   |  %d   |\n",p->ID,p->name,p->score[0],p->score[1],p->score[2]);
 return p;
}

LNODE * SortNode(LNODE *head)
{
    LNODE *max,*pmax,*nhead,*ntail,*p,*q;
 p=head;
 nhead=NULL;
 if(p->next == NULL)
 {
  return p;
 }
 else
 {
  while(p->next !=NULL)
  {
   max=p;
   for(q=p;q->next != NULL;q = q->next)
   {
    if(q->next->ID > max->ID)
    {
     pmax = q;
     max = q->next;
    }
   }
   if(max == p)
   {
    p=p->next;/* 若ID恰好最大的为头节点,则使节点的下一个节点为新的头结点*/
   }
   else
   {
    pmax->next=max->next;/*把最大的节点从原链表中分离出来,以便用新链表来链接*/
   }
   if(!nhead)  /*若新头节点为空*/
   {
       nhead=max;
    ntail=max;
   }
   else        /*若新头节点不为空*/
   {
    ntail->next=max;  /*将刚刚从原链表上脱离的节点接到新链表的尾节点之后*/
    ntail=max;       /*并使刚刚接上的节点成为新链表的新尾节点*/
   }
  }
        ntail->next=p;     /*将原链表中剩下的最后一个节点接到新链表尾节点之后*/
  ntail=p;           /*并使刚刚接上的节点成为新链表的新尾节点*/
  ntail->next=NULL;
 }
 printf("sort success\n");
 return nhead;

}

你可能感兴趣的:(C)