📄 wage.c
字号:
//包含文件
#include "stdio.h" /*I/O函数*/
# include "bios.h" /*ROM基本输入输出函数*/
#include "dos.h" /*dos接口函数*/
#include "conio.h" /*屏幕操作函数*/
#include "stdlib.h" /*其它说明*/
#include "process.h"
#include "string.h" /*字符串函数*/
#include "mem.h" /*内存操作函数*/
#include "ctype.h" /*字符操作函数*/
#include "alloc.h" /*动态地址分配函数*/
//变量及结构定义
typedef struct UserInfo /*定义数据结构*/
{
//员工编号
char UserNo[10];
//姓名
char UserName[20];
//工资
float Wage;
//其他工资信息
float OtherWage;
//员工链表结构前驱指针
struct UserInfo *prior;
//员工链表结构后继指针
struct UserInfo *next;
}user;
//管理员信息存储结构
typedef struct AdminInfo
{
char AdminName[20];
char Password[10];
}Admin;
//结构定义
struct UserInfo *First;
struct UserInfo *Last;
//Esc 按键定义
#define ESC 0x001b /* 退出 */
#define NULL 0
//初始化函数
void Initial()
{
First=NULL;
Last=NULL;
}
//输入数据,创建双链表
void CreateUser()
{
int x; /*记录行坐标*/
int i; /*记录输入记录数*/
int flag=0; /*做结束标记*/
float temp; /*定义临时变量*/
user *info,*p;
if(First!=NULL)
{
Initial();/*如果头指针为空,调用初始化函数*/
}
p=First; /*从头指针开始*/
for(;;)
{
if(flag==1)
break; /*如果flag=1,结束输入*/
i=0;
x=0; /*确定移动的行坐标*/
clrscr(); /*清屏*/
gotoxy(1,6);
printf("\t\t|***************WageManage System************|");/*输出标题*/
gotoxy(1,7);
printf("\t\t |-----------------Create User----------------|");
gotoxy(1,8);
printf("\t\t |------------------------------Input # to end|");/*提示输入@结束*/
gotoxy(1,9);
printf(" |--------------------------------------------|");/*输出表格的起始线*/
gotoxy(1,10);
printf("\t\t| UserNo | UserName | Wage |");/*输出字段标题,注意空格数*/
for(;;)
{
gotoxy(1,11+x);
printf(" |----------|--------------------|------------|");/*输出表格的水平线*/
info=(user *)malloc(sizeof(user));/*申请一个记录空间*/
if(!info)
{
printf("\n out of memory");/*如没有得到空间,输出内存溢出信息*/
exit(0);/*退出程序*/
}
info->next=NULL;/*新结点的后继为空*/
info->prior=NULL;/*新结点的前驱为空*/
gotoxy(17,12+x); printf("|"); /*输出数据间的分割线*/
gotoxy(28,12+x);printf("|");
gotoxy(49,12+x);printf("|");
gotoxy(62,12+x);printf("|");
gotoxy(18,12+x);/*光标到输入编号位置*/
inputs(info->UserNo,10);/*输入编号,并验证长度不超过10*/
if(info->UserNo[0] == '#')
{
flag=1;
break;
} /*编号首字符为#结束输入*/
gotoxy(29,12+x); /*光标到输入姓名位置*/
inputs(info->UserName,20); /*输入姓名,并验证长度不超过14*/
gotoxy(50,12+x); /*光标到输入基本工资位置*/
scanf("%f",&temp); /*输入基本工资到临时变量*/
info->Wage=temp; /*基本工资赋值*/
if(p==NULL)/*如果p为空,说明输入的是第一个结点*/
{
First=Last=info;/*头指针和尾指针*/
First->prior=NULL; /*头指针的前驱是空*/
Last->next=NULL; /*尾指针的后继是空*/
}
else /*插入的结点不是第一结点,则插入在头结点之前*/
{
info->next=p;/*新结点的后继指向原来的头结点*/
info->prior=p->prior;/*新结点的前驱指向原来的头结点的前驱*/
p->prior=info;/*原来结点的前驱指向新结点*/
}
p=info; /*新结点变为p结点,暂时的头结点*/
First=info; /*新结点变为头结点*/
x+=2; /*因为水平线,将光标下移两行*/
gotoxy(17,12+x);
i++; /*输入记录数加1*/
if(i%9==0)
break; /*输入9个记录,换一页输入*/
}
gotoxy(17,12+x);
}
printf("|----------|--------------------|--------|");/*输出结尾水平线*/
}
/*字符串输入和验证函数*/
inputs(char *s, int count)
{
char p[50];
do
{
scanf("%s",p);/*输入字符串*/
if(strlen(p)>count)
{
printf("\n too long! \n");/*进行长度校验,超过count值重输入*/
}
}
while(strlen(p)>count);
strcpy(s,p); /*将输入的字符串拷贝到字符串s中*/
}
/*显示链表*/
int List()
{
int i=0,n; /*记录输出行数*/
user *p; /*定义移动指针*/
clrscr(); /*清屏*/
p=First; /*从头指针开始*/
if(p == NULL)
{
printf("\n\n\n\n\n\n");
printf("\t\t User List is null,please press any key to return and create it");
getch();
return 1;
}
while(i%10==0&&p!=NULL) /*外循环控制换页*/
{
i=0; /*记录一页的输出行数*/
clrscr(); /*清屏*/
printf("\n\n\n\n\n\n");
printf("\t\t******************WageManage System******************\n"); /*输出大标题*/
printf("\t\t| UserNo | UserName | Wage |OtherWage|\n"); /*输出字段标题*/
printf("\t\t|----------|--------------------|---------|---------|\n"); /*输出水平线*/
while(p!=NULL) /*当p不为空时*/
{
printf("\t\t|%-10s|%-20s|%9.2f|%9.2f|\n",
p->UserNo,p->UserName,p->Wage,0.00);
p=p->next; /*指针后移*/
i++; /*输出行数加1 */
if(i%50==0)
break; /*如果满50行,跳出内循环*/
}
printf("\t\t***********************end***************************\n"); /*输出本页的结束行*/
printf("\n\n\n\n");
printf("\t\t Press any key to return......");
getch(); /*输出一页暂停一下,压任意键继续*/
} /*返回到外循环,准备下一页的输出*/
return 0;
}
//输出指针所指结点信息
void Print(user *p)
{
if(p) /*如果指针不为空,则显示信息*/
{
clrscr(); /*清屏*/
printf("\n\n\n\n\n\n"); /*换行*/
printf("\t\t **************WageManage System*****************\n"); /*输出标题信息*/
printf("\t\t | UserNo | UserName | Wage |OtherWage|\n"); /*输出字段标题*/
printf("\t\t |----------|---------------|---------|---------|\n"); /*输出分割线*/
printf("\t\t |%-10s|%-15s|%9.2f|%9.2f|\n", p->UserNo,p->UserName,
p->Wage,0.00);/*输出结点信息*/
printf("\t\t **********************end***********************\n"); /*输出结束标记*/
printf("\n\n\n");
}
}
/*单条显示记录*/
void Display()
{
int ch,key; /*菜单选项字符*/
user *p; /*定义临时指针*/
clrscr(); /*清屏*/
p=First; /*从头指针开始*/
if(p==NULL) /*指针为空,即链表为空,返回主函数*/
{
printf("record is empty!\n");
return;
}
else
{
Print(p); /*调用输出函数显示头结点信息*/
for(;;) /*循环开始*/
{
printf("\n\n\n");
printf("\t\t 0. Quit\n");
printf("\t\t 1. Prior\n");
printf("\t\t 2. Next\n");
printf("\t\t 3. First\n");
printf("\t\t 4. Last\n");
/*菜单项Quit退出 Prior前驱 Next后继 First第一条 Last最后一条*/
printf("\t\t Please select 0-4:"); /*提示输入菜单选项0~4*/
key=GetKey(); /*调用自定义函数,读取一个键*/
switch(key)
{
case 49: p=p->prior;if(p==NULL)p=First;break; /*指向前驱,没有前驱指向第一个*/
case 50: p=p->next;if(p==NULL) p=Last;break; /*指向后继,没有后继指向最后一个*/
case 51: p=First;break; /*指向第一个结点*/
case 52: p=Last;break; /*指向最后一个结点*/
case 48: return;
}
Print(p); /*调用输出函数显示指针所指结点信息*/
}
}
}
/*按编号查找记录*/
user *FindbyNo(char *No)
{
user *p; /*定义移动指针*/
p=First; /*从头指针开始*/
while(p) /*当p不为空时*/
{
if(!strcmp(No,p->UserNo))
return p; /*比较相等,查找成功,返回指针*/
p=p->next; /*不相等指针后移*/
}
return NULL; /*返回为空指针*/
}
/*删除结点*/
void DeleteUser()
{
user *p; /*定义临时变量,p指向要删除的结点p*/
char s[10]; /*要删除结点的编号*/
clrscr(); /*清屏*/
printf("\n\n\n\n\n");
printf("\t\t Please Input UserNo to delete:"); /*提示输入信息*/
printf("\n\n\n");
gotoxy(18,12);
scanf("%s",s); /*输入要删除的职工编号*/
if((p=FindbyNo(s))!=NULL) /*调用查找函数,如果找到做下面的处理*/
{
if(First==p) /*如果是第一个结点*/
{
First=p->next; /*将头指针指向其后继结点*/
if(First) /*如头指针不为空*/
First->prior=NULL; /*将头结点的前驱设为空*/
else
Last=NULL; /*否则头为空,尾也为空*/
}
else /*删除的不是第一个结点*/
{
p->prior->next=p->next; /*p的前驱的后继指向p原来的后继*/
if(p!=Last) /*如果p不是最后个结点*/
p->next->prior=p->prior; /*p后继的前驱指向p原来的前驱*/
else
Last=p->prior;/*如p是最后一个结点,修改尾指针为p的前驱*/
}
free(p); /*删除结点后,不要忘记释放空间*/
printf("\n\n\n");
printf("\t\t Delete User %s success\n",s);
printf("\n\n\n");
printf("\t\t Press any key to return......");
getch();
}
else
{
printf("\n\n\n");
printf("\t\t The UserNo %s isn't exist",s);
printf("\n\n\n");
printf("\t\t Press any key to return......");
getch();
}
}
/*按员工编号查找结点*/
void Search()
{
user *p; /*移动指针*/
char s[10]; /*保存员工编号*/
clrscr(); /*清屏*/
printf("\n\n\n\n\n\n");
printf("\t\t Please input UserNo to search:"); /*提示输入*/
printf("\n\n\n");
gotoxy(18,10);
scanf("%s",s); /*输入要查找人的编号*/
p=First; /*移动指针从头指针开始*/
while(strcmp(p->UserNo,s)&&p!=NULL) /*做比较判断*/
p=p->next; /*没找到,指针后移继续查找*/
if(p==NULL) /*指针为空,说明没有找到*/
{
printf("\n\n\n");
printf("\t\t The UserNo %s is not exist! \n",s); /*显示没找到信息*/
printf("\n\n\n");
printf("\t\t Press any key to return......");
getch();
}
else
{
printf("\n\n"); /*换行*/
Print(p); /*查找成功,调用输出函数输出指针p所指记录*/
printf("\n\n\n");
printf("\t\t Press any key to return......");
getch();
}
}
/*更新一个员工的基本资料*/
void Update(user *p)
{
char ch;
clrscr();
printf("\n\n\n\n\n");
printf("\t\t Select the Option to update:\n");
printf("\n\n");
printf("\t\t 1.UserNo\n");
printf("\t\t 2.UserName\n");
printf("\t\t 3.Wage\n");
printf("\t\t 4.OtherWage\n");
printf("\t\t 0.exit\n");
gotoxy(20,15);
while ((ch=getch())!='0')
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -