#include<stdio.h>
#include"stdlib.h"
#include"string.h"
/****************************************************
copyright: self_chou
Filename: SM.c
AUthour : self_chou Version: 1.0 Date: 2012.07
Description: 用链表实现简单的学生管理系统
Function List:
create(); 学生信息插入函数
sort(); 排序函数(冒泡排序)
my_remove(); 删除函数
find_print(); 查找函数(写的很酱油)
disp(); 界面函数
*******************************************************/
int x; int n; int del; //记不清了。。。。。蛋疼 int flag = 0; struct node *ptr,*qtr; struct score { int ch; int ma; int en; //学生信息结构体,写复杂了 int av; }; typedef struct node { char name[10]; int age; struct score sc; struct node *next; struct node *prev; }node; struct node *head = NULL; struct node *last = NULL; void create(int n) //尾插入 { struct node *p,*q; char s[10]; int age; int i=1; if(head == NULL) { printf("请输入第%d个姓名\n",i); scanf("%s",s); printf("请输入第%d个年龄\n",i); scanf("%d",&age); head=(struct node *)malloc(sizeof(struct node)); strcpy(head->name,s); head->age=age; head->sc.ch = rand()0+1; head->sc.ma = rand()0+1; head->sc.en = rand()0+1; head->sc.av = (head->sc.ch+head->sc.ma+head->sc.en)/3; head->prev = NULL; head->next = NULL; p=head; q=head; while(n-1!=0) { i++; p->next=(struct node *)malloc(sizeof(struct node)); p=p->next; printf("请输入第%d个姓名\n",i); scanf("%s",s); printf("请输入第%d个年龄\n",i); scanf("%d",&age); strcpy(p->name,s); p->age=age; p->sc.ch = rand()0+1; p->sc.ma = rand()0+1; p->sc.en = rand()0+1; p->sc.av = (p->sc.ch+p->sc.ma+p->sc.en)/3; p->prev=q; q=p; n--; } p->next=NULL; q=NULL; } else { p = last; q = last; while(n!=0) { p->next=(struct node *)malloc(sizeof(struct node)); p=p->next; printf("请输入第%d个姓名\n",i); scanf("%s",s); printf("请输入第%d个年龄\n",i); scanf("%d",&age); strcpy(p->name,s); p->age=age; p->sc.ch = rand()0+1; p->sc.ma = rand()0+1; p->sc.en = rand()0+1; p->sc.av = (p->sc.ch+p->sc.ma+p->sc.en)/3; p->prev=q; q=p; n--; i++; } p->next=NULL; q=NULL; } last = p; } void print(struct node *p) { while(p!=NULL) { printf("(姓名:%s ,平均成绩:%d)",p->name,p->sc.av); last = p; p=p->next; } printf("\n"); } void sort() //冒泡排序,写复杂了。。。 { struct node *p, *q; int i,j,flag; p = head; n = 0; while(p != NULL) { n++; p = p->next; } if(n == 1) { return 0; } for( i=0;i<n-1;i++) { flag=0; p=head; q=p->next; for( j=0;j < n-i-1;j++) { if( p == head) { if( q->next == NULL ) { if( p->sc.av >q->sc.av ) { q->next = p; q->prev = NULL; p->next = NULL; p->prev = q; head = q; return 0; } else return 0; } else { if(p->sc.av > q->sc.av) { p->next = q->next; q->next->prev = p; p->prev =q; q->next = p; q->prev = NULL; head = q; q = p->next; flag++; } else { p = q; q = q->next; } } } else if(q->next != NULL) { if(p->sc.av > q->sc.av) { q->prev = p->prev; p->prev->next = q; p->next = q->next; q->next->prev = p; q->next = p; p->prev = q; q = p->next; flag++; } else { p = q; q = q->next; } } else { if( p->sc.av > q->sc.av ) { p->prev->next = q; q->prev = p->prev; q->next = p; p->prev = q; p->next = NULL; flag++; } } } if(flag == 0) { break; } } } int find_print(int n) //查找与指定年龄最接近的学生姓名 { node *p; p=head; if(p->sc.av > n) { printf("最接近的人的姓名是:%s\n",p->name); return 0; } while(p->next != NULL) { if(p->sc.av <= n <= p->next->sc.av ) { break; } else p=p->next; } if(p->next == NULL) { printf("最接近的人的姓名是:%s\n",p->name); return 0; } else { if( ( n - (p->sc.av) ) < ( (p->next->sc.av) - n) ) { printf("最接近的人的姓名是:%s\n",p->name); return 0; } else { printf("最接近的人的姓名是:%s\n",p->next->name); return 0; } } } int my_remove(int y) { ptr = qtr = head; if(y == 1) { if(head->next != NULL) { head = head->next; free(ptr); } else { head = NULL; } return 0; } while( ( (y-1) != 0) && ptr != NULL) { qtr = ptr; ptr = ptr->next; y--; } if(ptr == NULL) { printf("数据库中没有此学生\n"); return 0; } else { qtr->next = ptr->next; free(ptr); printf("删除完成\n"); ptr = qtr = head; return 0; } } void disp() { printf("本程序使用的分数是0-100的随机数\n"); while(1) { printf("***********************************************************\n"); printf(" 请选择功能\n"); printf(" 1.增加学生信息\n"); printf(" 2.删除学生信息\n"); printf(" 3.排序\n"); printf(" 4.查找\n"); printf(" 5.退出\n"); printf("***********************************************************\n"); printf("请输入选择的功能\n"); scanf("%d",&x); switch(x) { case 1: { printf("请输入要插入的学生人数\n"); scanf("%d",&n); create(n); printf("插入完成,现有学生如下\n"); print(head); flag = 0; break; } case 2: { if(head == NULL) { printf("数据库中没有学生\n"); break; } printf("现有学生如下\n"); print(head); printf("请输入要删除第几个学生\n"); scanf("%d",&del); my_remove(del); printf("删除后\n"); print(head); flag =0; break; } case 3: { if(head == NULL) { printf("数据库中没数据,无法排序\n"); break; } printf("现有学生如下\n"); print(head); sort(); printf("按平均分排序后\n"); print(head); flag =1; break; } case 4: { if(head == NULL) { printf("数据库中没数据,无法排序\n"); break; } if(flag == 0) { printf("数据已改变,但未排序,请排序后查找\n"); break; } printf("现有学生如下\n"); print(head); printf("请输入要查找的平均成绩\n"); scanf("%d",&n); find_print(n); break; } case 5: { printf("欢迎使用本学生管理系统!\n"); exit(0); } default: { printf("输入有误,请重新输入\n"); break; } } } } int main() { disp(); return 0; }
延伸:
在ubuntu12.04中安装好sqlite3并掌握SQL语言;服务器把用户登陆密码
表和学生成绩等信息存放在数据库中;客户端通过socket与并发服务器建立连接,可
以进行学生的注册登录,学生只可以常看成绩和网上报名;管理员可以修改服务器上学
生的信息(管理员账户内置)。
并发服务器的建立参看我的另一篇博文
http://blog.csdn.net/self_chou/article/details/7805035