单向链表实现学生管理程序

/* TC 2.01 测试通过  非 tc 请自行修改  */
/* 没有全面测试  自行解决 嘿嘿       by碎心竹   */
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <ctype.h>

#define NAME 16
#define SEX  6

/*
#define NO   6
#define AGE  3
#define CLAS 3
*/
#define ERROR 0
#define OK    1

/*
1、学生名单管理
任务:可以实现学生名单的增加、删除、修改、显示、排序;

姓名、         性别、  年龄、  学号、 班级、 基础课成绩、专业课程成绩,总成绩
name            sex    age     no     clas   base        pro        sum
zhangwenhui      n      24   123456     5     70          60        130


*/

typedef struct nod
{
  int     no;
  char    name[NAME];
  char    sex[SEX];
  short   int age;
  short   int clas;
  int     base;
  int     pro;
  int     sum;
  struct nod *next;
}Nod;

int readfile(Nod *head,FILE *fp);   /*  从文件读取数据 */
int writefile(FILE *fp,Nod *head); /* 数据写入文件   */
Nod * createnod(void);   /*   创建空链表   */
int destroynod(Nod *head); /*销毁 链表 */
int getline(char *pch,int x); /* 字符输入 */
int getdig(int *i);   /*数字输入*/
int insetnod (Nod *head); /*  顺序插入一个学员 */
int deletenod(Nod *head); /*删除一个学员 */
int sortnod(Nod *head);          /*排序 列表 */
int printnod(Nod *head);        /*显示所有 具有分屏功能*/
modifynod(Nod *head); /* 修改学员资料 */
void mainlist(int open,FILE *fp);       /* 主菜单*/


main(void)
{
   int open = 0;    /* 文件打开 */
   FILE *fp;
   fp = fopen ("data.txt","r");
   if (!fp) {
      open = 1;
   }
   
   textbackground(BLUE);
   textcolor(YELLOW);
   clrscr();
   
   printf(" /n/n/n/n/n/n/n/n/n/t/t/t *************************/n"
          " /t/t/t *                       */n"
          " /t/t/t *                       */n"
          " /t/t/t *   Welcom  to this  !  */n"
          " /t/t/t *                       */n"
          " /t/t/t *                       */n"
          " /t/t/t *************************/n"
          "/n/n/n/n/n/n/n/n/n/nPlease any key to continue......../n");
   getch();
   mainlist(open,fp);
   
   return 0;
}/* main() */

void mainlist(int open,FILE *fp)
{
        int ch;
  Nod *head = NULL;
  if (fp){        
    head = createnod();
    readfile(head,fp);           
  }
  
  while(1){
    textcolor(YELLOW);
    clrscr();
    printf("/n/n/n "
           "/t/t/t*******************************/n"
           "/t/t/t*                             */n"
           "/t/t/t*   1. Creat a list           */n"
           "/t/t/t*   2. Add a student          */n"
           "/t/t/t*   3. Del a student          */n"
           "/t/t/t*   4. Print list             */n"
           "/t/t/t*   5. Modify a student       */n"
           "/t/t/t*   6. Sort list for No       */n"
           "/t/t/t*   7. Load File * do't use!  */n"
           "/t/t/t*   8. Wirte File for list    */n"
           "/t/t/t*                             */n"
           "/t/t/t*******************************/n"
           
           
           "/t/t/tOther is  Exit !!! /n"
          );
          
    if(!open)
       printf("/n/n/n/n FILE   IS OPEN !!!!!!/n");
    else
       printf("/n/n/n/n FILE NOT OPEN   Now is Write Mode !!/n");
    ch=getch();

    switch(ch){
      case '1':if (!open){
                  textcolor(WHITE);
                  clrscr();
                  
                  printf("/n/nFile Is Open Not Write /n/nPlease  Input 7 /n/n/n Please any key to continue/n");
                  getch();
                  continue;
               }
               else if(head){
                  textcolor(WHITE);
                  clrscr();
                  printf("Lis Is have Now  Not be Create /n/n/nPlease any key to continue/n");
                  getch();
                  continue;
               }
                  head = createnod();
                  textcolor(WHITE);
                  clrscr();
                  printf("/nCreat   List  OK! /n/nPlease Input 2 for Add a studen /n/n/nPlease any key to continue/n");
                  getch();
               break;
      case '2':if (!head){
                  textcolor(WHITE);
                  clrscr();
                  printf("/n/nList is Empty/n/n Please Input 1/n/n/n/n Please any key to continue/n");
                  getch();
                  continue;
               }
               else{
                  clrscr();                  
                  insetnod (head);
                }
               break;

      case '3':if (!head){
                  textcolor(WHITE);
                  clrscr();
                  printf("/n/nList is Empty /n/nPlease Input 1/n/n/n/n Please any key to continue/n");
                  getch();
                  continue;
               }
              else{
                  clrscr();
                  deletenod(head);
              }
              break;

      case '4':if (!head){
                  textcolor(WHITE);
                  clrscr();
                  printf("/n/nList is Empty/n/n Please Input 1/n/n/n/n Please any key to continue/n");
                  getch();
                  continue;
               }
               else{
                  clrscr();
                  printnod(head);
               }
               break;

      case '5':if (!head){
                  textcolor(WHITE);
                  clrscr();
                  printf("/n/nList is Empty Please Input 1/n/n/n Please any key to continue/n");
                  getch();
                  continue;
               }
               else{
                  
                  textcolor(YELLOW);
                  clrscr();
                  
                  modifynod(head);
                  printf("modif stdent OK/n/n/n Please any key to continue/n");
                  getch();
               }
               break;

      case '6':if (!head){
                  textcolor(WHITE);
                  clrscr();
                  printf("List is Empty /n/nPlease Input 1/n/n/n Please any key to continue/n");
                  getch();
                  continue;
               }
               else{
                  
                  textcolor(YELLOW);
                  clrscr();
                  sortnod(head);
                  printf("Sort stdent OK/n/n/n Please any key to continue/n");
                  getch();
                  
               }
               break;
/*
      case '7':if (open){
                  clrscr();
                  printf("File is Not Find  Please Create a list to Write it/n/n/n Please any key to continue/n");
                  getch();
                  continue;
               }
               else if (head){
                  clrscr();
                  printf("List is being Don't Read file /n/n/n  Please any key to continue/n");
                  getch();
                  continue;
               }
               else{
                  clrscr();
                  readfile(fp);
               }
               break;
*/
      case '8': if (!head){

                  textcolor(WHITE);
                  clrscr();
                  printf("/n/nList is Empty /n/nPlease Input 1/n/n/n Please any key to continue/n");
                  getch();
                  continue;
               }
               else{

                  textcolor(YELLOW);
                  clrscr();
                  writefile(fp,head);     
                  printf("File Write OK ! /n/n/n/nPlease any key to continue/n");
                  getch();  
               }
               break;

                 default :  destroynod(head);  exit(0);               
         }
         
         /*break; */
  }
  

               
}/* mainlist() */

Nod * createnod(void)
{

  Nod *head ;
  head = (Nod *) malloc( sizeof(Nod) );
  if (!head)
     return NULL;
          
  head->no   = 0;
  head->name[0] = '/0';
  head->sex[0]  = '/0';
  head->age  = 0;
  head->clas = 0;
  head->base = 0;
  head->pro  = 0;
  head->sum  = 0;
  head->next = NULL;
  return head;
}/* createnod() */

int insetnod (Nod *head)
{
  
  int no;
  Nod *curr, *front, *temp;

  if(!head)
    return ERROR;
    
  front = curr = head;

  textcolor(YELLOW);
  clrscr();
  printf("Please input this  student No./n");  /*  输入学号  */
  getdig(&no);
  

  
  while(NULL != curr && curr->next->no < no){ /* 寻找 插入位置 */
    front = curr;
    curr  = curr->next;    
  }
  
  temp = (Nod *) malloc( sizeof(Nod) );
  if(!temp)      
      return ERROR;

  temp->no = no;
  /*  printf("temp no:%d/n",temp->no); */  
  printf("Please Input this student Name:/n");
  getline(temp->name,NAME);
  /* printf("temp name :%s/n",temp->name);*/
  printf("Please Input this student Sex:/n");
  getline(&temp->sex,SEX);
  printf("Please Input this student Age:/n");
  getdig(&temp->age);
  printf("Please Input this student class:/n");
  getdig(&temp->clas);
  printf("Please Input this student base:/n");
  getdig(&temp->base);
  printf("Please Input this student Pro:/n");
  getdig(&temp->pro);
  temp->sum = temp->base + temp->pro;

  temp->next = front->next;
  front->next = temp;
  ++head->sum;  /* 链表总数+1 */

  return OK;
}/* insetnod() */


int getdig(int *no)
{
  int ch;
  *no = 0;

  while ( (ch = getchar()) != '/n' && ch != EOF){

    if ( isdigit(ch) && (*no * 10 + (ch -'0')) > 0 ){
       *no = *no * 10 + (ch - '0');
    }
  }
    /*  printf("no is : %d/n",*no);*/
  return OK;
}/* getdig() */


int getline(char *pch,int x)
{
  int i,ch;
   x -= 1;
   i = 0;
  if (x < 0)
     return ERROR;
 
  while ( (ch = getchar()) != '/n' && ch != EOF){
    
    if (i < x ){
      pch[i] = ch;
       /*  printf("pch is : %c/n",pch[i]);*/
      ++i;
    }    
  }  
  
    if (x > 1 ){
      pch[i] = '/0';    
     /* printf(" /  0 is input/n"); */
    }

  return OK;

}/* getline() */

int destroynod(Nod *head)   /* 销毁 */
{
    Nod *temp;
    temp = head;
    do{         
         head = temp;
         temp = head->next;
         printf("destroy %d/n",temp);
         free(head);
    }while (temp);
    printf("See You /n");
    return OK;
}/* destroynod() */

int deletenod(Nod *head)  /* 删除 */
{
    Nod *curr,*temp;
    int no;
    temp = curr = head;

    printf("Please input this  student No./n");  /*  输入要删除学号  */
    getdig(&no);


    while(NULL != curr) { /* 寻找 位置 */
        if (curr->no == no){
           head->next = curr->next;
           free(curr);
           --temp->sum;
           return OK;
        }
        
        head = curr;
        curr  = curr->next;    
    }
    printf("Nod Find No.%d  /n/n/n/nPlease any key to continue/n",no);
    getch();
    return ERROR;

} /* deletenod() */

int printnod(Nod *head)
{
    if (!head)
       return ERROR;    
    printf("all student is %d/n",head->sum);
    head = head->next;
    printf("%6s %10s %5s %5s %5s %5s %5d %5s/n",
            "No","name","sex","age","class","base","pro", "sum");     

    while (head){

        printf("%6d %10s %5s %5d %5d %5d %5d %5d/n",
        head->no,head->name,head->sex,head->age,head->clas,
        head->base,head->pro,head->sum);

        head = head->next;

       }
    printf("Please any key to continue/n");
    getch();
    return OK;
}


int writefile(FILE *fp,Nod *head)
{

   if (!head)
       return ERROR;
    
    fp = fopen ("data.txt","w");
    head = head->next;
    
    while(head != NULL){
     
        fputs(itoa(head->no,"",10),fp);
        fputc(' ',fp);
        fputs(head->name,fp);
        fputc(' ',fp);
        fputs(head->sex,fp);
        fputc(' ',fp);
        fputs(itoa(head->age,"",10),fp);
        fputc(' ',fp);
        fputs(itoa(head->clas,"",10),fp);
        fputc(' ',fp);
        fputs(itoa(head->base,"",10),fp);
        fputc(' ',fp);
        fputs(itoa(head->pro,"",10),fp);
        fputc(' ',fp);
        fputs(itoa(head->sum,"",10),fp);
        fputc('/n',fp);
        head = head->next;
    }

    fclose(fp);

    return OK;
}/* writefile() */


int readfile(Nod *head,FILE *fp)
{
    Nod *temp, *suu;
    char atmp[20];

    if (!fp || !head)
       return NULL;

    suu = head;
    while ( fscanf(fp,"%s",atmp) != EOF ){
/*        fscanf(fp,"%s",atmp);  */
        temp =(Nod *) malloc( sizeof(Nod) );
        temp->no = atoi(atmp);
        fscanf(fp,"%s",temp->name) ;
        fscanf(fp,"%s",temp->sex);
        fscanf(fp,"%s",atmp);
        temp->age  = atoi( atmp );
        fscanf(fp,"%s",atmp);
        temp->clas = atoi( atmp );
        fscanf(fp,"%s",atmp);
        temp->base = atoi( atmp );
        fscanf(fp,"%s",atmp);
        temp->pro  = atoi( atmp );
        fscanf(fp,"%s",atmp);
        temp->sum  = atoi( atmp );
        temp->next = NULL;
        ++suu->sum;                /*        */
        head->next = temp;
        head = head->next;
    }
    return OK;
}/* readfile() */


modifynod(Nod *head)/* 修改学员资料 */
{

    Nod *temp;
    int no;
    temp = head;

    printf("Please input this  student No./n");  /*  输入要修改学号  */
    getdig(&no);


    while(NULL != head) { /* 寻找 位置 */
        if (temp->no == no){
            
           printf("Please input this  student No./n");  /*  输入学号  */
           getdig(&no);
           temp->no = no;
           printf("Please Input this student Name:/n");
           getline(temp->name,NAME);  
           /* printf("temp name :%s/n",temp->name);*/
           printf("Please Input this student Sex:/n");
           getline(&temp->sex,SEX);
           printf("Please Input this student Age:/n");
           getdig(&temp->age);
           printf("Please Input this student class:/n");
           getdig(&temp->clas);
           printf("Please Input this student base:/n");
           getdig(&temp->base);
           printf("Please Input this student Pro:/n");
           getdig(&temp->pro);
           temp->sum = temp->base + temp->pro;

           return OK;
        }
        
        temp = temp->next;
    }
    printf("Nod Find No.%d  /n/n/nPlease any key to continue/n",no);
    getch();
    return ERROR;   
    
}/* modifynod() */


int sortnod(Nod *head)
{

  Nod *list,*r, *temp, *hhead;
  int max, i, l, ts;

  hhead = head;
  max = head -> sum-1;
  
  printf("max: %d/n",max);

  for (i = 0; i < max; i++){
    head = hhead;
    ts = 0; /* 测试 检查 */

      for (l = 0; l < max;l++){
            list = head -> next;
            r = list -> next;

            if(list->no > r->no){
                  temp = head->next;
                  head->next = list->next;
                  list -> next = r->next;
                  r->next = temp;
                  ++ts;
            }
            head = head->next;
      }
      if (0 == ts)
         return OK;
   }
  return OK;
}/* sortnod() */

/* 全文由 SciTE 导出生成 */
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值