#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與併發服務器建立連接,可
以進行學生的註冊登錄,學生只可以常看成績和網上報名;管理員可以修改服務器上學
生的信息(管理員賬戶內置)。
併發服務器的建立參看我的另一篇博文