您的位置:首页 > 其它

双链表实现简单的学生管理系统

2012-07-14 12:10 597 查看
#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与并发服务器建立连接,可
以进行学生的注册登录,学生只可以常看成绩和网上报名;管理员可以修改服务器上学
生的信息(管理员账户内置)。

并发服务器的建立参看我的另一篇博文

/article/9222604.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: