
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#include <conio.h>
#define TITLE "\n 月份 工号 姓名 应发工资 各种折扣 实发工资\n"
#define DATA " %2d %4ld %-10s %6.1f %6.1f %6.1f\n",p1->month,p1->num,p1->name,p1->should_pay,p1->rebate,p1->actual_pay
typedef struct pay
{
long num
short month
char name[20]
float gw,jn,zw,zl,jt,yj
float should_pay
float fz,gj,sd,others
float rebate
float actual_pay
struct pay *next
}PAY
FILE *fp
PAY *p1=NULL,*p2=NULL,*head=NULL
void menu()
PAY *input()
void output()
void save(PAY *head)
PAY *open()
PAY *insert()
void search()
PAY *del()
PAY *revise()
/*主程序模块*/
void main(void)
{
short sel
do
{
menu()
scanf("%d",&sel)
switch(sel)
{
case 1:
head=input() //输入模块
break
case 2:
head=insert() //插入模块
break
case 3:
head=revise() //修改模块
break
case 4:
head=del() //删除模块
break
case 5:
search() //查找模块
break
case 6:
output() //输出模块
break
case 7:
save(head) //保存模块
break
case 0:
break
}
}while(sel!=0)
}
/*菜单*/
void menu()
{
printf("\n\n\n\n\n\n\n")
printf("\t\t\t\t *主菜单选项*\n\n")
printf("\t\t\t\t1.创建工资档案\n")
printf("\t\t\t\t2.新增工资信息\n")
printf("\t\t\t\t3.修改工资信息\n")
printf("\t\t\t\t4.删除工资信息\n")
printf("\t\t\t\t5.查找工资信息\n")
printf("\t\t\t\t6.分类信息列表\n")
printf("\t\t\t\t7.保 存 信 息\n")
printf("\t\t\t\t0.退出\n")
printf("\n\n\n\n\n\n\n\n")
}
/*输入模块*/
PAY *input()
{
short n=1
p1=(PAY*)malloc(sizeof(PAY))
if(p1==NULL)
{
printf("内存不足,无法创建链表!")
getch()
}
printf("\n请输入第%d位职工的信息(以工号为0结束):\n",n)
printf("工号:")
scanf("%d",&p1->num)
if(p1->num==0)
{
printf("按任意键返回!")
getch()
free(p1)
return 0
}
getchar()
printf("姓名:")
gets(p1->name)
printf("工资月份:")
scanf("%d",&p1->month)
printf("岗位工资,技能工资,职务津贴,职龄津贴,交通补贴,业绩津贴:\n")
scanf("%f,%f,%f,%f,%f,%f",&p1->gw,&p1->jn,&p1->zw,&p1->zl,&p1->jt,&p1->yj)
printf("房租扣款,公积金,水电费,其它扣款:\n")
scanf("%f,%f,%f,%f",&p1->fz,&p1->gj,&p1->sd,&p1->others)
p1->should_pay=p1->gw+p1->jn+p1->zw+p1->zl+p1->jt+p1->yj
p1->rebate=p1->fz+p1->gj+p1->sd+p1->others
p1->actual_pay=p1->should_pay-p1->rebate
while(p1!=NULL)
{
if(n==1)
head=p1
else
p2->next=p1
n++
p2=p1
p1=(PAY*)malloc(sizeof(PAY))
if(p1==NULL)
{
printf("内存不足,无法创建链表!")
getch()
}
printf("请输入第%d位职工的信息(以工号为0结束):\n",n)
printf("工号:")
scanf("%d",&p1->num)
getchar()
if(p1->num==0)
{
p1=NULL
break
}
printf("姓名:")
gets(p1->name)
printf("工资月份:")
scanf("%d",&p1->month)
printf("岗位工资,技能工资,职务津贴,职龄津贴,交通补贴,业绩津贴:\n")
scanf("%f,%f,%f,%f,%f,%f",&p1->gw,&p1->jn,&p1->zw,&p1->zl,&p1->jt,&p1->yj)
printf("房租扣款,公积金,水电费,其它扣款:\n")
scanf("%f,%f,%f,%f",&p1->fz,&p1->gj,&p1->sd,&p1->others)
p1->should_pay=p1->gw+p1->jn+p1->zw+p1->zl+p1->jt+p1->yj
p1->rebate=p1->fz+p1->gj+p1->sd+p1->others
p1->actual_pay=p1->should_pay-p1->rebate
}
p2->next=NULL
//edit by Yan-Xingyu Class Network-021
printf("职工信息已输入,请按任意键返回,并存盘……")
getch()
return head
}
/*输出模块*/
void output()
{
short sel,flag,month
float min,max
do
{
do
{
printf("\n\n请选择您的列表方式:\n")
printf("\t\t1.全部清单\n")
printf("\t\t2.按月输出\n")
printf("\t\t3.按工资段输出\n")
printf("\t\t0.返回\n")
scanf("%d",&sel)
}while(sel!=1&&sel!=2&&sel!=3&&sel!=0)
head=open()
if(head==NULL)
return
else
switch(sel)
{
case 1:
printf("\n\t\t\t******全部清单******\n")
printf(TITLE)
p1=head
do
{
printf(DATA)
p1=p1->next
}while(p1!=NULL)
break
case 2:
flag=0
printf("输入要查的月份:")
scanf("%d",&month)
printf("\n\t\t\t******第%d月工资清单******\n",month)
printf(TITLE)
p1=head
do
{
if(p1->month==month)
{
printf(DATA)
p1=p1->next
flag=1
}
else
p1=p1->next
}while(p1!=NULL)
if(flag==0)
printf("没有该月清单\n")
break
case 3:
flag=0
printf("输入最低工资:")
scanf("%f",&min)
printf("输入最高工资:")
scanf("%f",&max)
printf("\n\t\t ******%5.1f到%5.1f工资的名单******\n",min,max)
printf(TITLE)
p1=head
do
{
if(p1->actual_pay>min&&p1->actual_pay<max)
{
printf(DATA)
p1=p1->next
flag=1
}
else
p1=p1->next
}while(p1!=NULL)
if(flag==0)
printf("没有该工资段的职工\n")
break
case 0:
break
}
}while(sel!=0)
}
/*保存文件*/
void save(PAY *head)
{
short write
fp=fopen("pay.txt","w")
if(fp==NULL)
{
printf("创建文件失败!")
getch()
return
}
p1=p2=head
while(p1!=NULL)
{
write=fwrite(p1,sizeof(PAY),1,fp)
if(!write)
{
printf("无法写入文件!")
getch()
return
}
p1=p1->next
}
fclose(fp)
printf("成功存盘!")
getch()
}
/*打开文件*/
PAY *open()
{
short n=1,read
fp=fopen("pay.txt","r")
if(fp==NULL)
{
printf("无法打开档案文件!")
getch()
return NULL
}
if((p1=p2=(PAY*)malloc(sizeof(PAY)))==NULL)
{
printf("内存不足!")
getch()
return NULL
}
read=fread(p1,sizeof(PAY),1,fp)
if(!read)
{
printf("文件读取出错!1")
getch()
return NULL
}
if(p1->next==NULL)
head=p1
else
{
do
{
if(n==1)
head=p1
else
p2->next=p1
n++
p2=p1
if((p1=(PAY*)malloc(sizeof(PAY)))==NULL)
{
printf("内存不足!")
getch()
return NULL
}
read=fread(p1,sizeof(PAY),1,fp)
if(!read)
{
printf("文件读取出错!2")
getch()
return NULL
}
}while(p1->next!=NULL)
p2->next=p1
}
return head
fclose(fp)
}
/*插入模块*/
PAY *insert()
{
PAY *p3=NULL
char sel
head=open()
if(head==NULL)
return NULL
else
do
{
printf("请输入要插入的职工信息:\n")
p3=(PAY*)malloc(sizeof(PAY))
if(p3==NULL)
{
printf("内存不足,无法创建链表!")
getch()
}
printf("工号:")
scanf("%d",&p3->num)
getchar()
printf("姓名:")
gets(p3->name)
printf("工资月份:")
scanf("%d",&p3->month)
printf("岗位工资,技能工资,职务津贴,职龄津贴,交通补贴,业绩津贴:\n")
scanf("%f,%f,%f,%f,%f,%f",&p3->gw,&p3->jn,&p3->zw,&p3->zl,&p3->jt,&p3->yj)
printf("房租扣款,公积金,水电费,其它扣款:\n")
scanf("%f,%f,%f,%f",&p3->fz,&p3->gj,&p3->sd,&p3->others)
p3->should_pay=p3->gw+p3->jn+p3->zw+p3->zl+p3->jt+p3->yj
p3->rebate=p3->fz+p3->gj+p3->sd+p3->others
p3->actual_pay=p3->should_pay-p3->rebate
p1=head
while(p1!=NULL)
{
p2=p1
p1=p1->next
}
p2->next=p3
p3->next=NULL
printf("成功插入,是否继续?是(Y) 否(N)\n")
sel=getch()
}while(sel=='Y'||sel=='y')
printf("\n任意键返回,并存盘……\n")
getch()
return head
}
/*查找模块*/
void search()
{
short sel
long num
char name[20],choose
head=open()
if(head==NULL)
return
else
do
{
do
{
printf("\n选择查找方式:\n")
printf("\t\t1.按工号查找\n")
printf("\t\t2.按姓名查找\n")
scanf("%d",&sel)
getchar()
}while(sel!=1&&sel!=2)
switch(sel)
{
case 1:
printf("输入要查的工号:")
scanf("%ld",&num)
break
case 2:
printf("输入要查的姓名:")
gets(name)
break
}
p1=head
while((p1->next!=NULL)&&(p1->num!=num)&&(strcmp(p1->name,name)!=0)) //用成p1!=NULL有问题?
p1=p1->next
if((p1->num==num)||strcmp(p1->name,name)==0)
{
printf("您要查找的信息如下:\n")
printf(TITLE)
printf(DATA)
}
else
printf("没有该信息!\n")
printf("是否继续?是(Y) 否(N)\n")
choose=getch()
}while(choose=='Y'||choose=='y')
printf("任意键返回")
getch()
}
/*删除模块*/
PAY *del()
{
short sel
long num
char name[20],choose
head=open()
if(head==NULL)
return NULL
else
do
{
do
{
printf("\n选择删除方式:\n")
printf("\t\t1.按工号删除\n")
printf("\t\t2.按姓名删除\n")
scanf("%d",&sel)
getchar()
}while(sel!=1&&sel!=2)
switch(sel)
{
case 1:
printf("输入要删除的工号:")
scanf("%ld",&num)
break
case 2:
printf("输入要删除的姓名:")
gets(name)
break
}
p1=head
if((p1->num==num)||strcmp(p1->name,name)==0)
{
head=p1->next
printf("删除信息成功!")
}
else
{
while((p1->next!=NULL)&&(p1->num!=num)&&(strcmp(p1->name,name)!=0))
{
p2=p1
p1=p1->next
}
if((p1->num==num)||strcmp(p1->name,name)==0)
{
p2->next=p1->next
free(p1)
printf("\n删除信息成功!\n")
}
else
printf("\n没有该信息!\n")
}
printf("是否继续?是(Y) 否(N)\n")
choose=getch()
}while(choose=='Y'||choose=='y')
printf("任意键返回,并存盘……")
getch()
return head
}
/*修改模块*/
PAY *revise()
{
short sel
long num
char name[20],choose
head=open()
if(head==NULL)
return NULL
else
do
{
do
{
printf("\n查找要修改的对象:\n")
printf("\t\t1.按工号查找\n")
printf("\t\t2.按姓名查找\n")
scanf("%d",&sel)
getchar()
}while(sel!=1&&sel!=2)
switch(sel)
{
case 1:
printf("输入要查的工号:")
scanf("%ld",&num)
break
case 2:
printf("输入要查的姓名:")
gets(name)
break
}
p1=head
while((p1->next!=NULL)&&(p1->num!=num)&&(strcmp(p1->name,name)!=0)) //用成p1!=NULL有问题?
p1=p1->next
if((p1->num==num)||strcmp(p1->name,name)==0)
{
printf("您要修改的原始信息如下:\n")
printf(TITLE)
printf(DATA)
printf("\n将上述信息改为如下信息:\n")
printf("工号:")
scanf("%d",&p1->num)
getchar()
printf("姓名:")
gets(p1->name)
printf("工资月份:")
scanf("%d",&p1->month)
printf("岗位工资,技能工资,职务津贴,职龄津贴,交通补贴,业绩津贴:\n")
scanf("%f,%f,%f,%f,%f,%f",&p1->gw,&p1->jn,&p1->zw,&p1->zl,&p1->jt,&p1->yj)
printf("房租扣款,公积金,水电费,其它扣款:\n")
scanf("%f,%f,%f,%f",&p1->fz,&p1->gj,&p1->sd,&p1->others)
p1->should_pay=p1->gw+p1->jn+p1->zw+p1->zl+p1->jt+p1->yj
p1->rebate=p1->fz+p1->gj+p1->sd+p1->others
p1->actual_pay=p1->should_pay-p1->rebate
}
else
printf("你要修改的信息不存在!\n")
printf("是否继续?是(Y) 否(N)\n")
choose=getch()
}while(choose=='Y'||choose=='y')
printf("任意键返回,并存盘……")
getch()
return head
}
#include <stdio.h>#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#define MONTH_NUM 5 /* 最多的月份 */
struct worker
{
int number /* 每个工人的工号 */
char name[15]/* 每个工人的姓名 */
int salary[MONTH_NUM] /* 每个工人M月的工资 */
int sum /* 每个工人的总工资 */
float average /* 每个工人的平均工资 */
struct worker *next
}
typedef struct worker STU
char Menu(void)
int Ascending(int a, int b)
int Descending(int a, int b)
void IntSwap(int *pt1, int *pt2)
void CharSwap(char *pt1, char *pt2)
void FloatSwap(float *pt1, float *pt2)
STU *AppendNode(STU *head, const int m)
STU *DeleteNode(STU *head, int nodeNum)
STU *ModifyNode(STU *head, int nodeNum, const int m)
STU *SearchNode(STU *head, int nodeNum)
STU *Appendsalary(STU *head, const int m)
void Totalsalary(STU *head, const int m)
void Printsalary(STU *head, const int m)
STU *Deletesalary(STU *head, const int m)
void Modifysalary(STU *head, const int m)
void Sortsalary(STU *head, const int m, int (*compare)(int a, int b))
void Searchsalary(STU *head, const int m)
void DeleteMemory(STU *head)
main()
{
char ch
int m
STU *head = NULL
printf("输入要记录的月份(m<10):")
scanf("%d", &m)
while (1)
{
ch = Menu()
switch (ch)
{
case'1':head = Appendsalary(head, m)
Totalsalary(head, m)
break
case'2':Printsalary(head, m)
break
case'3':head = Deletesalary(head, m)
printf("\nAfter deleted\n")
Printsalary(head, m)
break
case'4':Modifysalary(head, m)
Totalsalary(head, m)
printf("\nAfter modified\n")
Printsalary(head, m)
break
case'5':Searchsalary(head, m)
break
case'6':Sortsalary(head, m, Descending)
printf("\nsorted in descending order by sum\n")
Printsalary(head, m)
break
case'7':Sortsalary(head, m, Ascending)
printf("\nsorted in ascending order by sum\n")
Printsalary(head, m)
break
case'0':exit(0)
DeleteMemory(head)
printf("End of program!")
break
default:printf("Input error!")
break
}
}
}
char Menu(void)
{
char ch
printf("\n管理工人的工资\n")
printf(" 1.添加记录\n")
printf(" 2.列出记录\n")
printf(" 3.删除记录\n")
printf(" 4.修改记录\n")
printf(" 5.查找记录\n")
printf(" 6.降序排列\n")
printf(" 7.升序排列\n")
printf(" 0.退出\n")
printf("请输入你的选择:")
scanf(" %c", &ch)/*在%c前面加一个空格,将存于缓冲区中的回车符读入*/
return ch
}
STU *Appendsalary(STU *head, const int m)
{
int i = 0
char c
do{
head = AppendNode(head, m) /*向链表末尾添加一个节点*/
printf("你想添加一个新的记录吗(Y/N)?")
scanf(" %c",&c) /*%c前面有一个空格*/
i++
}while (c=='Y' || c=='y')
printf("%d new nodes have been apended!\n", i)
return head
}
STU *Deletesalary(STU *head, const int m)
{
int i = 0, nodeNum
char c
do{
printf("请输入你想删除的记录编号:")
scanf("%d", &nodeNum)
head = DeleteNode(head, nodeNum)/*删除工号为nodeNum的工人信息*/
Printsalary(head, m) /*显示当前链表中的各节点信息*/
printf("Do you want to delete a node(Y/N)?")
scanf(" %c",&c)/*%c前面有一个空格*/
i++
}while (c=='Y' || c=='y')
printf("%d nodes have been deleted!\n", i)
return head
}
void Modifysalary(STU *head, const int m)
{
int i = 0, nodeNum
char c
do{
printf("请输入你想修改的记录编号:")
scanf("%d", &nodeNum)
head = ModifyNode(head, nodeNum, m) /*修改工号为nodeNum的节点*/
printf("Do you want to modify a node(Y/N)?")
scanf(" %c",&c) /*%c前面有一个空格*/
i++
}while (c=='Y' || c=='y')
printf("%d nodes have been modified!\n", i)
}
void Totalsalary(STU *head, const int m)
{
STU *p = head
int i
while (p != NULL) /*若不是表尾,则循环*/
{
p->sum = 0
for (i=0i<mi++)
{
p->sum += p->salary[i]
}
p->average = (float)p->sum / m
p = p->next /*让p指向下一个节点*/
}
}
void Sortsalary(STU *head, const int m, int (*compare)(int a, int b))
{
STU *pt
int flag = 0, i
do{
flag = 0
pt = head
/*若后一个节点的总工资比前一个节点的总工资高,则交换两个节点中的数据
注意只交换节点数据,而节点顺序不变,即节点next指针内容不进行交换*/
while (pt->next != NULL)
{
if ((*compare)(pt->next->sum, pt->sum))
{
IntSwap(&pt->number, &pt->next->number)
CharSwap(pt->name, pt->next->name)
for (i=0i<mi++)
{
IntSwap(&pt->salary[i], &pt->next->salary[i])
}
IntSwap(&pt->sum, &pt->next->sum)
FloatSwap(&pt->average, &pt->next->average)
flag = 1
}
pt = pt->next
}
}while(flag)
}
/*交换两个整型数*/
void IntSwap(int *pt1, int *pt2)
{
int temp
temp = *pt1
*pt1 = *pt2
*pt2 = temp
}
/*交换两个实型数*/
void FloatSwap(float *pt1, float *pt2)
{
float temp
temp = *pt1
*pt1 = *pt2
*pt2 = temp
}
/*交换两个字符串*/
void CharSwap(char *pt1, char *pt2)
{
char temp[15]
strcpy(temp, pt1)
strcpy(pt1, pt2)
strcpy(pt2, temp)
}
/*决定数据是否按升序排序,a<b为真,则按升序排序*/
int Ascending(int a, int b)
{
return a <b
}
/* 决定数据是否按降序排序,a>b为真,则按降序排序 */
int Descending(int a, int b)
{
return a >b
}
void Searchsalary(STU *head, const int m)
{
int number, i
STU *findNode
printf("请输入你想查找的记录编号:")
scanf("%d", &number)
findNode = SearchNode(head, number)
if (findNode == NULL)
{
printf("Not found!\n")
}
else
{
printf("\nNo.%3d%8s", findNode->number, findNode->name)
for (i=0i<mi++)
{
printf("%7d", findNode->salary[i])
}
printf("%9d%9.2f\n", findNode->sum, findNode->average)
}
}
void Printsalary(STU *head, const int m)
{
STU *p = head
char str[100] = {'\0'}, temp[3]
int i, j = 1
strcat(str, "Number Name ")
for (i=1i<=mi++)
{
strcat(str, "salary")
itoa(i,temp, 10)
strcat(str, temp)
strcat(str, " ")
}
strcat(str," sum average")
printf("%s", str) /* 打印表头 */
while (p != NULL)/*若不是表尾,则循环打印*/
{
printf("\nNo.%3d%15s", p->number, p->name)
for (i=0i<mi++)
{
printf("%7d", p->salary[i])
}
printf("%9d%9.2f", p->sum, p->average)
p = p->next /*让p指向下一个节点*/
j++
}
printf("\n")
}
STU *AppendNode(STU *head, const int m)
{
STU *p = NULL
STU *pr = head
int j
p = (STU *)malloc(sizeof(STU)) /*为新添加的节点申请内存*/
if (p == NULL) /*若申请内存失败,则打印错误信息,退出程序*/
{
printf("No enough memory to alloc")
exit(0)
}
if (head == NULL) /*若原链表为空表,则将新建节点置为首节点*/
{
head = p
}
else/*若原链表为非空,则将新建节点添加到表尾*/
{
/*若未到表尾,则继续移动指针pr,直到pr指向表尾*/
while (pr->next != NULL)
{
pr = pr->next
}
pr->next = p/*将新建节点添加到链表的末尾*/
}
pr = p/*让pr指向新建节点*/
printf("Input node data......")
printf("\nInput number:")
scanf("%d", &p->number)
printf("Input name:")
scanf("%s", p->name)
for (j=0j<mj++)
{
printf("Input salary%d:", j+1)
scanf("%d", p->salary+j)
}
pr->next = NULL /*将新建节点置为表尾*/
return head /*返回添加节点后的链表的头节点指针*/
}
STU *ModifyNode(STU *head, int nodeNum, const int m)
{
int j
STU *newNode
newNode = SearchNode(head, nodeNum)
if (newNode == NULL)
{
printf("Not found!\n")
}
else
{
printf("Input the new node data:\n")
printf("Input name:")
scanf("%s", newNode->name)
for (j=0j<mj++)
{
printf("Input salary%d:", j+1)
scanf("%d", newNode->salary+j)
}
}
return head
}
STU *DeleteNode(STU *head, int nodeNum)
{
STU *p = head, *pr = head
if (head == NULL) /*链表为空,没有节点,无法删除节点*/
{
printf("No Linked Table!\n")
return(head)
}
/*若没找到节点nodeNum且未到表尾,则继续找*/
while (nodeNum != p->number &&p->next != NULL)
{
pr = p
p = p->next
}
if (nodeNum == p->number) /*若找到节点nodeNum,则删除该节点*/
{
if (p == head)/*若待删节点为首节点,则让head指向第2个节点*/
{
head = p->next
}
else /*若待删节点非首节点,则将前一节点指针指向当前节点的下一节点*/
{
pr->next = p->next
}
free(p) /*释放为已删除节点分配的内存*/
}
else /*没有找到待删除节点*/
{
printf("This Node has not been found!\n")
}
return head /*返回删除节点后的链表的头节点指针*/
}
STU *SearchNode(STU *head, int nodeNum)
{
STU *p = head
int j = 1
while (p != NULL)/*若不是表尾,则循环*/
{
if (p->number == nodeNum) return p
p = p->next /*让p指向下一个节点*/
j++
}
return NULL
}
void DeleteMemory(STU *head)
{
STU *p = head, *pr = NULL
while (p != NULL) /*若不是表尾,则释放节点占用的内存*/
{
pr = p /*在pr中保存当前节点的指针*/
p = p->next /*让p指向下一个节点*/
free(pr) /*释放pr指向的当前节点占用的内存*/
}
}
凑合着用吧,一些缺少的功能自己加上去就行了。。。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)