雙鏈表實現簡單的學生管理系統

#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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章