c语言课程设计—教师工作量管理系统源代码

如题所述

#include<stdio.h> //标准输入、输出头文件
#include<string.h> //包含字符串函数处理头文件
#include<stdlib.h> //包含动态存储与释放函数头文件
#include<iostream> // system
#define TEALEN sizeof(teanode) //教师信息结构体长度
#define LEN sizeof(Lnode) //链表节点长度
#define MAX 10
int SAME[MAX];

typedef struct teanode
{
char name[10]; //教师姓名
int lesson; //授课工作量
int exper; //实验工作量
int cdesign; //课程设计工作量
int gdesign; //毕业设计工作量
int total; //总工作量
int pos; //排序位置
}teanode,*linknode;//教师信息结构体

typedef struct Lnode
{
char no[20]; //教师编号
linknode info; //节点信息详细指针指向教师信息结构体
struct Lnode *prior,*next; //双向链表指针域
}Lnode,*linklist;//链表节点

void newLnode();
void initlist();
void prin();

void initlist(linklist *T)
{
*T=(linklist)malloc(LEN);
(*T)->info=(linknode)malloc(TEALEN);//为头结点申请空间
(*T)->prior=*T;//设置头结点的前驱指针
(*T)->next=*T;//设置头结点的后继指针
}//初始化双向循环链表

void newLnode(linklist*p)
{
*p=(linklist)malloc(LEN);//新节点
if(!p)
{
printf("申请节点失败");
exit(0);
}
(*p)->info=(linknode)malloc(TEALEN);
}

void prin(linklist * L)
{

if(L==NULL)
{
printf("没有可以显示的信息\n");
return;
}
linklist p=(*L)->next;
// printf("********************************************************************************\n");
printf("教师编号 教师姓名 工作量排名 工作总量\n\n");
while (p!=*L)
{

printf("%7s%9s%10d%10d\n",p->no,p->info->name,p->info->pos,p->info->total);
p=p->next;
}
}

void main()
{
linklist input(linklist L);
linklist sort(linklist L);
int j;//用来判断是否结束
linklist L;
initlist(&L);

do{
system("cls");//清屏函数
printf(" ★--- 您好,欢迎进入教师工作量统计系统! ---★\n");
printf("================================================================================\n");
printf( " -------- ☆ 1.输入教师工作量信息 ☆-------- \n\n"
" -------- ☆ 2.进行教师工作量排序 ☆-------- \n\n"
" -------- ☆ 3.显示教师工作量情况 ☆-------- \n\n"
" -------- ☆ 0.退出 ☆-------- \n\n");
printf("================================================================================\n");
printf("请在0-3中选择以回车键结束:\n\n");
scanf("%d",&j);
switch(j) {
case 1:
L=input(L);
prin(&L);
printf("录入结束\n");
system("pause");
break;

case 2:
L=sort(L);
printf("排序成功\n");
system("pause");
break;
case 3:
prin(&L);
system("pause");
break;
case 0:;
break;
}
}while(j!=0);
printf("谢谢使用,再见!\n");
}//主函数结束

linklist input(linklist L)
{
linklist workload(linklist p);
linklist adworkload(linklist p);
linklist searinsert(linklist L,linklist p);
linklist sort(linklist L);
int flag=0;
char no[10];
linklist p;

p=L->next;
for(;;)
{
if(flag==1)
break;
printf("请输入教师编号输入@结束:\n\n");
scanf("%s",no);
if(no[0]=='@')
{
flag=1;
break;
}

while (p!=L)//当链表不空时
{
if (strcmp(p->no,no)==0)
{
printf("该教师编号已存在,输入需要增加的工作量\n\n");
p->prior->next=p->next;
p->next->prior=p->prior;//删除P,
p=adworkload(p);//修改P中的详细信息info指针域的内容
L=searinsert(L,p);//重新查找P的位置插入链表L中

return L;
}
p=p->next;
}//跳出循环则该教师编号第一次输入
newLnode(&p);
strcpy(p->no,no);
printf("请输入教师姓名:\n");
scanf("%s",p->info->name);
p=workload(p);
L=searinsert(L,p);
}
return L;
}
linklist adworkload(linklist p)
{
int a;
printf("请输入增加的授课工作量:\n");
scanf("%d",&a);
p->info->lesson+=a;

printf("请输入增加的实验工作量:\n");
scanf("%d",&a);
p->info->exper+=a;

printf("请输入增加的课程设计工作量:\n");
scanf("%d",&a);
p->info->cdesign+=a;

printf("请输入增加的毕业设计工作量:\n");
scanf("%d",&a);
p->info->gdesign+=a;

//p->info->pos=0;

p->info->total=p->info->lesson+p->info->exper+p->info->cdesign+p->info->gdesign;//求总工作量
return p;
}

linklist workload(linklist p)
{
printf("请输入该教师的授课工作量:\n");
scanf("%d",&(p->info->lesson));

printf("请输入该教师的实验工作量:\n");
scanf("%d",&(p->info->exper));

printf("请输入该教师的课程设计工作量:\n");
scanf("%d",&(p->info->cdesign));

printf("请输入该教师的毕业设计工作量:\n");
scanf("%d",&(p->info->gdesign));

p->info->pos=0;

p->info->total=p->info->lesson+p->info->exper+p->info->cdesign+p->info->gdesign;//求总工作量
return p;
}

linklist searinsert(linklist L,linklist p)
{//将P放置L中合适的位置

linklist tra;//遍历指针
linklist x;//P插入位置的前一个节点指针
tra=L->next;//指向第一个节点
if ((L->next==L)||(p->info->total>tra->info->total)) //第一次插入或者大于表头的情况
{
x=L;//插入表头
}
else if (p->info->total<L->prior->info->total) //小于表尾的情况
{
x=L->prior;//插入表尾
}
else
{ while (p->info->total<tra->info->total)
tra=tra->next;
x=tra->prior;//正常查找情况
}
//将P接到X后面
p->next=x->next;
p->prior=x;
x->next=p;
p->next->prior=p;
return L;
}

linklist sort(linklist L)
{
linklist sortfisrtlast(linklist L,linklist first,linklist last,int n);
int i;
for(i=0;i<MAX;i++)
SAME[i]=0;//初始化数组SAME[MAX]

linklist p,first,last;
int x,n=1,k;
p=L->next;

while (p!=L)
{

x=1;
while ((p->next->info->total!=p->info->total)&&p!=L)
{
p->info->pos=n;
p=p->next;
n++;
}
if (p==L)
return L;
else

while ((p->next->info->total==p->info->total)&&p!=L)
{
k=n;
if (x==1)
{
//k=n;
first=p;
}
p->info->pos=k;
x++;
p=p->next;

p->info->pos=k;
//保存X
SAME[k]=x;
}
n+=x-1;
if (p==L)
return L;
else
{
last=p;
p=last->next;
L=sortfisrtlast(L,first,last,k);//调用fisrt last函数
}
}
}
linklist sortfisrtlast(linklist L,linklist first,linklist last,int n)
{
if (first==last)
return L;
linklist head,posa,posb,p,t;
linklist tra;//遍历指针
linklist x;//P插入位置的前一个节点指针
posa=first->prior;//接入位置a
posb=last->next;//接入位置b
posa->next=last->next;
last->next->prior=posa;
last->next=NULL;
first->prior=NULL;//删除这段
initlist(&head);
p=first;
while (p!=NULL)
{
tra=head->next;
if ((head->next==head)||strcmp(p->no,tra->no)<0)//第一次插入或者小于当前节点
x=head;
else if (strcmp(p->no,head->prior->no)>0)
x=head->prior;
else
{
while(strcmp(p->no,tra->no)>0)
tra=tra->next;
x=tra->prior;
}
t=p;//将P接到X后
p=p->next;
t->next=x->next;
t->prior=x;
x->next=t;
t->next->prior=t;

}
printf("********************************************************************************\n");
// printf("================================================================================\n");
printf("工作量名次相同的教师名单:(按编号排序)\n\n");
printf("名次为%d教师共有%d名\n\n",n,SAME[n]);
prin(&head);
first=head->next;
last=head->prior;

posa->next=first;
first->prior=posa;

posb->prior=last;
last->next=posb;
return L;
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2018-03-29
#include<stdio.h> //标准输入、输出头文件
#include<string.h> //包含字符串函数处理头文件
#include<stdlib.h> //包含动态存储与释放函数头文件
#include<iostream> // system
#define TEALEN sizeof(teanode) //教师信息结构体长度
#define LEN sizeof(Lnode) //链表节点长度
#define MAX 10
int SAME[MAX];

typedef struct teanode
{
char name[10]; //教师姓名
int lesson; //授课工作量
int exper; //实验工作量
int cdesign; //课程设计工作量
int gdesign; //毕业设计工作量
int total; //总工作量
int pos; //排序位置
}teanode,*linknode;//教师信息结构体

typedef struct Lnode
{
char no[20]; //教师编号
linknode info; //节点信息详细指针指向教师信息结构体
struct Lnode *prior,*next; //双向链表指针域
}Lnode,*linklist;//链表节点

void newLnode();
void initlist();
void prin();

void initlist(linklist *T)
{
*T=(linklist)malloc(LEN);
(*T)->info=(linknode)malloc(TEALEN);//为头结点申请空间
(*T)->prior=*T;//设置头结点的前驱指针
(*T)->next=*T;//设置头结点的后继指针
}//初始化双向循环链表

void newLnode(linklist*p)
{
*p=(linklist)malloc(LEN);//新节点
if(!p)
{
printf("申请节点失败");
exit(0);
}
(*p)->info=(linknode)malloc(TEALEN);
}

void prin(linklist * L)
{

if(L==NULL)
{
printf("没有可以显示的信息\n");
return;
}
linklist p=(*L)->next;
// printf("********************************************************************************\n");
printf("教师编号 教师姓名 工作量排名 工作总量\n\n");
while (p!=*L)
{本回答被网友采纳
第2个回答  2011-03-01
可以依靠百度Hi通知我
有时间可以解决你的问题
同样的要求也可以通知我

ES:\\E0B475A004D21038346598B01230A947
交易提醒:预付定金是陷阱
第3个回答  2016-01-28
你可以去淘宝买的嘛。
相似回答