Advertisement

C语言学生信息管理系统 (单链表版)

阅读量:
复制代码

`

`

复制代码
 //以单链表作为存储结构,设计和实现课程成绩管理的完整程序。程序包括如下功能。

    
 //1.建立学生成绩表,包含学生的学号、姓名和成绩。
    
 //2.可以显示所有学生成绩。
    
 //3.可以计算学生的总数。
    
 //4.可以按学号和序号查找学生。
    
 //5.可以在指定位置插入学生成绩数据。
    
 //6.可以删除指定位置的学生数据。
    
 //7.可以把学生成绩按从高到低的顺序排序。
    
  
    
 //作者: yinlinqvan
    
 //操作系统:Mac OS X
    
 //编译器:gcc
    
  
    
 #include "string.h"
    
 #include "sys/malloc.h"
    
 #include "stdlib.h"
    
 #include "stdio.h"
    
 #include "time.h"
    
 #include "sys/types.h"
    
 #define MAXSIZE 100
    
  
    
 typedef struct Student
    
 {
    
     char sname[9];
    
     char sno[5];
    
     int score;
    
 }DataType;
    
  
    
 typedef struct
    
 {
    
     DataType data;
    
     struct Node *next;
    
 }LinkList;
    
  
    
 LinkList * inputdata();
    
  
    
 void display(LinkList * p);
    
  
    
 //遍历链表
    
 void displayAll(LinkList * L);
    
  
    
 //插入
    
 LinkList * createTailList();//尾插
    
 LinkList * createHeadList();//头插
    
  
    
 //查询
    
 void getElem(LinkList * L, int i);//按序号
    
 void locateElemBysno(LinkList * L, char ch[]);//按值
    
 void locateElemBysname(LinkList * L, char ch[]);
    
  
    
 int lengthList(LinkList * L);
    
  
    
 //插入
    
 void insertElem(LinkList * L, int i);//在第i个结点前进行插入
    
 void insertElemBysno(LinkList * L, char ch[5]);//按学号
    
  
    
 void deleteElem(LinkList * L, char ch[]);
    
  
    
 //排序
    
 void insertSort(LinkList * L);
    
  
    
 int menue();
    
  
    
 int main(int argc,char *argv[])
    
 {
    
     LinkList *L;
    
     char sno[5] = {'\0'};
    
     char sname[9] = {'\0'};
    
     int b = 1;
    
     int i = 1;
    
     while (b) {
    
     switch(menue())
    
 		{
    
         case 1:
    
             L = createTailList();
    
             //L = createHeadList();
    
             break;
    
         case 2:
    
             //displayAll(L);
    
             printf("\t◎输入插入哪个位置前:");
    
             scanf("%d", &i);
    
             insertElem(L, i);
    
             //scanf("%s", sno);
    
             //insertElemBysno(L, sno);
    
             break;
    
         case 3:
    
             printf("\t◎输入待删除学生的学号:");
    
             scanf("%s", sno);
    
             deleteElem(L, sno);
    
             break;
    
         case 4:
    
             printf("╭═══════════════════════════════╮\n");
    
             printf("║\t学生总数为:%d\t\t║\n", lengthList(L));
    
             printf("╰═══════════════════════════════╯\n\n");
    
             break;
    
         case 5:
    
             printf("\t◎输入待查找学生的学号:");
    
             scanf("%s", sno);
    
             locateElemBysno(L, sno);
    
             break;
    
         case 6:
    
             printf("\t◎输入待查学生的位置:");
    
             scanf("%d", &i);
    
             getElem(L, i);
    
             break;
    
         case 7:
    
             displayAll(L);
    
             break;
    
         case 8:
    
             insertSort(L);
    
             break;
    
         case 9:
    
             i = 2;
    
             while (i)
    
             {                    
    
                 system("clear");
    
                 printf("\033[5m");
    
                 printf("\033[?25l");        //隐藏光标
    
                 printf("\n\n\n\n\n\n");
    
                 printf("╭═══════════════════════════════╮\n");
    
                 printf("║\t正在退出(%d秒)\t\t║\n", i--);
    
                 printf("╰═══════════════════════════════╯\n");
    
  
    
                 sleep(1);
    
             }
    
             printf("\033[0m");
    
             system("clear");
    
             return 0;
    
             break;
    
         default:
    
             i = 2;
    
             while (i)
    
             {
    
                 system("clear");
    
                 printf("╭═══════════════════════════════╮\n");
    
                 printf("║操作数无效,正在返回主菜单(%d秒)║\n", i--);
    
                 printf("╰═══════════════════════════════╯\n");
    
                 sleep(1);
    
             }
    
             continue;
    
 		}
    
     getchar();
    
     printf("PRESS ENTER TO CONTINUE!");
    
     while (1) {
    
         if ('\n' == getchar())
    
         {
    
             break;
    
         }
    
     }
    
 	}
    
     return 0;
    
 }
    
 int menue()
    
 {
    
     system("clear");
    
     //警告音
    
     printf("\033[0m");              //关闭所有属性
    
  
    
     printf("\033[44;37m");          //47是字背景颜色,33是字体的颜色
    
     printf ("\033[5m");             //闪烁
    
     printf("\n^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^\n\n");
    
     printf("\033[0m");              //关闭所有属性
    
     
    
     printf("\033[44;37m");
    
     printf("╭═══════════════════════════════╮\n");
    
     printf("║\t学生成绩管理程序\t║\n");
    
     printf("║\t\t\t\t║\n");
    
     printf("║\t<1>创建\t\t\t║\n");
    
     printf("║\t<2>指定位置后插入\t║\n");
    
     printf("║\t<3>按位置删除\t\t║\n");
    
     printf("║\t<4>求学生总数\t\t║\n");
    
     printf("║\t<5>按学号查找\t\t║\n");
    
     printf("║\t<6>按位置查找\t\t║\n");
    
     printf("║\t<7>显示所有学生\t\t║\n");
    
     printf("║\t<8>成绩排序\t\t║\n");
    
     printf("║\t<9>退出\t\t\t║\n");
    
     printf("╰═══════════════════════════════╯\n\n");
    
  
    
     printf ("\033[5m");
    
     printf("^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^\n\n");
    
     printf("\033[0m");              //关闭所有属性
    
  
    
     time_t rawtime;
    
     struct tm * timeinfo;
    
     time ( &rawtime );
    
     timeinfo = localtime ( &rawtime );
    
     //printf ( "\t\007%s", asctime (timeinfo) );
    
     
    
     printf ("\033[;34m");
    
     printf ("\t[%4d-%02d-%02d %02d:%02d:%02d]\n",
    
         1900+timeinfo->tm_year,
    
         1+timeinfo->tm_mon,
    
         timeinfo->tm_mday,
    
         timeinfo->tm_hour,
    
         timeinfo->tm_min,
    
         timeinfo->tm_sec);
    
     
    
     char colorname[3][20] = {{"RED"}, {"BLUE"}, {"YELLLOW"}};
    
     srand(time(&rawtime));  //时间触发
    
     //textcolor(colorname[rand()%3]);
    
     //printf("\t[textcolor is %s]\n", colorname[rand()%3]);
    
     //颜色码和控制码 我的参考链接 http://wenku.baidu.com/view/a38f77ff910ef12d2af9e70b.html
    
     
    
     printf("\t◎输入功能项:");    
    
     int a = 0;
    
     scanf("%d",&a);
    
     printf("\033[0m");
    
  
    
     system("clear");
    
     return a;
    
 }
    
  
    
 LinkList * inputdata()
    
 {
    
     LinkList *s = NULL;
    
     char sno[5] = {'\0'};
    
     char sname[9] = {'\0'};
    
     int  score = 0;
    
     
    
     printf("\tsno\t->");
    
     scanf("%s", sno);
    
     if (sno[0] == '#') {
    
     return s;
    
     }
    
     s = (LinkList *)malloc(sizeof(LinkList));
    
     strcpy(s -> data.sno, sno);
    
     
    
     printf("\tsname\t->");
    
     scanf("%s", sname);
    
     strcpy(s -> data.sname, sname);
    
     
    
     printf("\tscore\t->");
    
     scanf("%d", &score);
    
     s -> data.score = score;
    
     
    
     printf("\n");
    
     return s;
    
 }
    
  
    
 void display(LinkList * p) 
    
 {
    
     printf("╭═══════════════════════════════════════════════╮\n");
    
     printf("║\tsno\t\tsname\t\tscore\t║\n");
    
     printf("║\t%s\t\t%s\t\t%-4d\t║\n", p->data.sno, p->data.sname, p->data.score);
    
     printf("╰═══════════════════════════════════════════════╯\n\n");}
    
 void displayAll(LinkList * L)
    
 {
    
     printf("╭═══════════════════════════════════════════════╮\n");
    
     printf("║\tsno\t\tsname\t\tscore\t║\n");
    
     LinkList * p = L -> next;
    
     while(p)
    
     {
    
     printf("║\t%s\t\t%s\t\t%-4d\t║\n", p->data.sno, p->data.sname, p->data.score);
    
     p = p -> next;
    
     }
    
     printf("╰═══════════════════════════════════════════════╯\n\n");
    
 }
    
 LinkList * createTailList()
    
 {
    
     //链表头结点
    
     LinkList * L = (LinkList *)malloc(sizeof(LinkList));
    
     //结点
    
     LinkList * s = NULL;
    
     //尾结点
    
     LinkList * r = L;
    
                                   
    
     printf("╭═══════════════════════════════════════════════╮\n");
    
     printf("║\t\t尾插法建立\t\t\t║\n");
    
     printf("║\t请输入学生信息(当学号为\"#\"时结束)\t║\n");
    
     printf("║\t\t\t\t\t\t║\n");
    
     printf("║\t学号sno     (不超过4位)\t\t║\n");
    
     printf("║\t姓名sname   (不超过4个汉字)\t\t║\n");
    
     printf("║\t成绩score   (int型)\t\t\t║\n");
    
     printf("╰═══════════════════════════════════════════════╯\n\n");
    
                                   
    
     while (1) {
    
     s = inputdata();
    
     if (!s) {
    
         break;
    
     }
    
     r->next = s;
    
     r = s;
    
     }
    
     r->next = NULL;
    
     return L;
    
 }
    
  
    
 LinkList * createHeadList()
    
 {
    
     //链表头结点
    
     LinkList * L = (LinkList *)malloc(sizeof(LinkList));
    
     //结点
    
     LinkList * s = NULL;
    
     
    
     printf("╭═══════════════════════════════════════════════╮\n");
    
     printf("║\t\t头插法建立\t\t║\n");
    
     printf("║\t请输入学生信息(当学号为\"#\"时结束)\t║\n");
    
     printf("║\t\t\t\t\t\t║\n");
    
     printf("║\t学号sno     (不超过4位)\t\t║\n");
    
     printf("║\t姓名sname   (不超过4个汉字)\t\t║\n");
    
     printf("║\t成绩score   (int型)\t\t\t║\n");
    
     printf("╰═══════════════════════════════════════════════╯\n\n");
    
     while (1) {
    
     s = inputdata();
    
     if (!s) {
    
         break;
    
     }
    
     s->next = L->next;
    
     L->next = s;
    
     }
    
     return L;
    
 }
    
  
    
 void getElem(LinkList * L, int i)
    
 {
    
     LinkList * p = L;
    
     int j = 0;
    
     while (p && j<i) {
    
     p = p->next;
    
     j++;
    
     }
    
     if (!p) {
    
     printf("╭═══════════════════════════════╮\n");
    
     printf("║\tDon't find the student!\t║\n");
    
     printf("╰═══════════════════════════════╯\n\n");
    
     }
    
     else
    
     {
    
     display(p);
    
     }
    
 }
    
  
    
 void locateElemBysno(LinkList * L, char ch[5])
    
 {
    
     LinkList * p = L->next;
    
     while (p && (0 != strcmp(p->data.sno, ch)))
    
     {
    
     p = p -> next;
    
     }
    
     if (!p) {
    
     printf("╭═══════════════════════════════╮\n");
    
     printf("║\tDon't find the student!\t║\n");
    
     printf("╰═══════════════════════════════╯\n\n");
    
     }
    
     else
    
     {
    
     display(p);
    
     }
    
 }
    
 void locateElemBysname(LinkList * L, char ch[9])
    
 {
    
     LinkList * p = L->next;
    
     while (p && (0 != strcmp(p->data.sname, ch)))
    
     {
    
     p = p -> next;
    
     }
    
     if (!p) {
    
     printf("╭═══════════════════════════════╮\n");
    
     printf("║\tDon't find the student!\t║\n");
    
     printf("╰═══════════════════════════════╯\n\n");
    
     }
    
     else
    
     {
    
     display(p);
    
     }
    
 }
    
 int lengthList(LinkList * L)
    
 {
    
     LinkList * p = L->next;
    
     int j = 0;
    
     while (p) {
    
     p = p->next;
    
     j ++;
    
     }
    
     return j;
    
 }
    
 void insertElem(LinkList * L, int i)
    
 {
    
     LinkList * s = inputdata();
    
     LinkList * p = L;
    
     int j = 0;
    
     while (p && j<i-1)
    
     {
    
     p = p->next;
    
     j++;
    
     }
    
     if (p && p->next)
    
     {
    
     s->next = p->next;
    
     p->next = s;
    
     }
    
     else
    
     {
    
     printf("╭═══════════════════════════════╮\n");
    
     printf("║\tDon't find the student!\t║\n");
    
     printf("╰═══════════════════════════════╯\n\n");
    
     }
    
     displayAll(L);
    
  
    
 }
    
  
    
 void insertElemBysno(LinkList * L, char ch[5])
    
 {
    
     LinkList * p = L;
    
     LinkList * s = NULL;
    
     
    
     while (p && (0 != strcmp(p->data.sno, ch)))
    
     {
    
     p = p->next;
    
     }
    
     if (!p) {
    
     printf("╭═══════════════════════════════╮\n");
    
     printf("║\tDon't find the student!\t║\n");
    
     printf("╰═══════════════════════════════╯\n\n");
    
     }
    
     else
    
     {
    
     s = inputdata();
    
     s->next = p->next;
    
     p->next = s;
    
     }
    
 }
    
  
    
 void deleteElem(LinkList * L, char ch[5])
    
 {
    
     LinkList *p, *q;
    
     p = L->next;
    
     q=L;
    
     while (p && (strcmp(p->data.sno, ch) != 0)) {
    
     q = p;
    
     p = p->next;
    
     }
    
     if (!p) {
    
     printf("╭═══════════════════════════════╮\n");
    
     printf("║\tDon't find the student!\t║\n");
    
     printf("╰═══════════════════════════════╯\n\n");
    
     }
    
     else
    
     {
    
     display(p);
    
     q->next = p->next;
    
     free(p);
    
     }
    
 }
    
 void insertSort(LinkList * L)
    
 {
    
     LinkList * L1;
    
     LinkList * p;
    
     LinkList * q;
    
     LinkList * s;
    
     int len;
    
     len = lengthList(L);
    
     L1 = (LinkList *)malloc(sizeof(LinkList));
    
     if (L->next) {
    
     s = (LinkList *)malloc(sizeof(LinkList));
    
     strcpy(s->data.sno, L->data.sno);
    
     strcpy(s->data.sname, L->data.sname);
    
     s->data.score = L->data.score;
    
     s->next = NULL;
    
     L1->next = s;
    
     q = L->next;
    
     }
    
     else
    
     {
    
     printf("╭═══════════════════════════════════╮\n");
    
     printf("║\tThe student link list is empty!\n║\n");
    
     printf("╰═══════════════════════════════════╯\n\n");
    
  
    
     return;
    
     }
    
     while (q) {
    
     p = L1->next;
    
     while (p &&(p->data.score >= q->data.score))
    
     {
    
         p = p->next;
    
     }
    
     s = (LinkList *)malloc(sizeof(LinkList));
    
     strcpy(s->data.sno, q->data.sno);
    
     strcpy(s->data.sname, q->data.sname);
    
     s->data.score = q->data.score;
    
     if (!p) {
    
         s->next = NULL;
    
         p->next = s;
    
     }
    
     else
    
     {
    
         s->next = p->next;
    
         p->next = s;
    
     }
    
     q = q->next;
    
     }
    
     displayAll(L1);
    
 }

全部评论 (0)

还没有任何评论哟~