C语言 TC 职工工资管理系统 数据结构课程设计 带头结点单循环链表

C语言 TC 职工工资管理系统 数据结构课程设计 带头结点单循环链表

来博客员的第一篇,过往没什么总结,把上学时的课程设计源码放上来,纪念

#include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct node  /*结构类型定义*/ {   int num; /*编号*/     char nam[20];/*姓名*/  char sex[4];/*性别*/  int bam;/*基础工资*/  int dem;/*扣除工资*/  int inm;/*补贴工资*/  int mon;/*实际工资*/    struct node *next;
}*Link,LNode;

Link inilink(Link head) {   head=(Link)malloc(sizeof(struct node));   head->next=NULL;   return(head); } void mimaqueren(); void meau(); void xinmima(); void setlink(Link head); void printlink(Link head); void search(Link head); void numbersearch(Link head); void namesearch(Link head); void insert(Link head); void loadlink(Link head); void savelink(Link head); void paixuxuanze(Link head); void paixu1(Link head); void paixu2(Link head); void paixu3(Link head); void paixu4(Link head); void paixu5(Link head); void tongjixuanze(Link head); void tongji1(Link head); void tongji2(Link head); void tongji3(Link head); void tongji4(Link head); void bianhaoqueren(Link head,Link q); void charu(Link head,Link p); void charu1(Link head); void charu2(Link head); void delnumber(Link head); void delname(Link head);

  /*密码修改*/ /*没有密码文件或为空时直接进入,有密码确定密码,没密码时修改密码为建立新密码 不过这样每次一个函数完后要有个meau()*/  void mimaqueren(Link head) { static int i=1;   FILE *fp;    char mima[16],shuru[16]; if((fp=fopen("mima.txt","rb"))==NULL)    meau(head); else     fgets(mima,16,fp);       printf("请输入密码");  gets(shuru);   while(strcmp(mima,shuru)!=0&&i<4)    {  i++;       printf("密码错误,请重新输入:");       mimaqueren(head);    }               if(strcmp(mima,shuru)==0)          
         meau(head);      else exit(0);

     fclose(fp); }

void mimaxiugai() /*修改密码*/ {   char a[10],b[10];   int t=0;   FILE *fp;   fp=fopen("mima.txt","rb");    if(fp==NULL)    {    printf("程序未设密码,请设定\n");       xinmima(fp);    }    getchar();       fgets(a,10,fp);        printf("请输入旧密码:");        gets(b);         while(strcmp(a,b)!=0&&t<2)   {         printf("输入密码错误!!!\n请重新输入:\n");      t++;         gets(b);   }
  if(t<2)       xinmima(fp); } void xinmima(FILE *fp) {      
    char a[10],b[10];     int j=0,k;        printf("请输入新密码:");        scanf("%s",&a);        printf("请再次输入确认密码:");        scanf("%s",&b);        while(strcmp(a,b)!=0)        {     printf("两次输入不同!\n");     printf("请重新输入:");     xinmima(fp);        }     printf("密码修改成功!\n");  fp=fopen("mima.txt","w");     k=strlen(a);  for(j=0;j<k;j++)  putc(a[j],fp);        fclose(fp);        meau(); } /*数据录入*/ /*这个倒好做,把单链表录入改一下就行,难在不能有同号的,这费了不少时间 用了不少方法,判断简单,就是反回不行,递归不行,测反回也不行,函数 也不行,最后把输入编号放入循环里,有同号继续循环,无同号退出*/ void setlink(Link head) { /*建立单链表*/   Link p,q,r;   int i=0;int c;   int a=1;   int b;   printf("\n");    p=head;    r=head->next;    while(a==1)    {   q=(LNode *)malloc(sizeof(struct node));     b=1;     while(b==1)/*编码确认部分*/     {      printf("输入编号:\n");    scanf("%d",&q->num);    r=head->next;      while(r!=NULL&&r!=head&&r->num!=q->num)      { 
     r=r->next;      }         if(r==NULL||r==head)       b=0;         else      {printf("你输入的员工已录入,请重新输入。\n");      b=1;    }

    }   printf("输入姓名:\n");scanf("%s",&q->nam);   printf("输入性别:");scanf("%s",&q->sex);      printf("输入基本工资:\n");scanf("%d",&q->bam);      printf("输入补贴工资:\n"); scanf("%d",&q->inm);      printf("输入扣除工资:\n");scanf("%d",&q->dem);      q->mon=q->bam+q->inm-q->dem;        p->next=q;p=q;   i++;         printf("是否输入另一个数据?\n输入1继续录入,其他键退出");      scanf("%d",&c);   getchar();    if(c==1)    { q->next=head;
    continue;       }    else    {   q->next=head;    break;    }    } printlink(head); getchar(); meau(head); }
void printlink(Link head) { /*输出线性单链表*/    Link p;    p=head->next;    printf("编号    姓名    性别    基础工资    扣除工资    补贴工资    实际工资\n");    while(p!=head)    {      printf("%2d%10s%6s%11d%12d%12d%12d\n",p->num,p->nam,p->sex,p->bam,p->dem,p->inm,p->mon);      p=p->next;    } }   /*数据查找*/ /*选择查找方式*/   void search(Link head)   {int choose=0;   printf("1按编号\n");   printf("2按姓名\n");   printf("3返回上级目录\n");   printf("请输入查询方式:\n");   scanf("%d",&choose);     switch(choose)  {  case 1:numbersearch(head);break;  case 2:namesearch(head);break;  case 3:meau(head);break;  }   }   /*编号直接比较,有相同则输出结点,没有反回*/   void numbersearch(Link head)   {    int y;    Link p;    p=head->next;        printf("请输入所要查询的编号:\n");      scanf("%d",&y);     while(p!=head&&p->num!=y)     { 
    p=p->next;     }    if(p==head)     printf("没有该学生数据。");    else     printf("编号 姓名 性别 基础工资 扣除工资 补贴工资 实际工资\n");           printf("%2d%10s%6s%11d%12d%12d%12d\n",p->num,p->nam,p->sex,p->bam,p->dem,p->inm,p->mon);   getchar();   meau(head);   } /*姓名支持模糊查询*/ /*  strlen测输入名字长度,strncopy分别复制输入字符串的前几位,进行比较,出过小问题   因为char后几位字符不定,所以一直是无数据,对c b 字符串初始为空解决*/

void namesearch(Link head) {   char y[20];   char c[20]="";   char b[20]="";      Link p;   int t;   int a=1;      p=head->next;      printf("请输入所要查询的姓名:\n");      scanf("%s",&y);   t=strlen(y);   strncpy(c,y,t);       while(p!=head)        {    strncpy(b,p->nam,t);    if(strcmp(c,b)==0)    {      if(a==1)      {printf("编号 姓名 性别 基础工资 扣除工资 补贴工资 实际工资\n");          a=0;      }               printf("%2d%10s%6s%11d%12d%12d%12d\n",p->num,p->nam,p->sex,p->bam,p->dem,p->inm,p->mon);    
   }        p=p->next;  

  }             if(a==1)     printf("没有该学生数据。");      
getchar(); meau(head); }

/*数据插入*/ void insert(Link head) {   int choose=0;   printf("1想要插入到第几行\n");   printf("2在编号为几的数据后插入数据\n");   printf("3返回上级目录\n");   printf("请输入查询方式:\n");   scanf("%d",&choose);     switch(choose)  {  case 1:charu1(head);break;  case 2:charu2(head);break;  case 3:meau(head);break;  }   } void charu1(Link head) {int t;  int i=0; Link p; p=head; printf("请输入想要插入的行:"); scanf("%d",&t); for(i=0;i<t;i++) {/*找p*/  p=p->next; } charu(head,p); }

/*在某编号后插入,这个用了查找里的一部分*/ void charu2(Link head) {    int y;    Link p;    p=head->next;    printf("你要在编号为几的数据后插入\n");      scanf("%d",&y);     while(p!=head&&p->num!=y)     { 
    p=p->next;            }        if(p==head)     {printf("输入错误,没有该点。\n");     }     else charu(head,p);

  getchar();   meau(head); }

 

void charu(Link head,Link p) {Link q,r; int b=1; int k; int c; int m;    r=head->next;   q=(Link)malloc(sizeof(struct node));     while(b==1)/*编码确认部分,和录入一样*/     {      printf("输入编号:\n");    scanf("%d",&q->num);    r=head->next;      while(r!=NULL&&r!=head&&r->num!=q->num)      { 
     r=r->next;      }         if(r==NULL||r==head)       b=0;         else      {printf("你输入的员工已录入,请重新输入。\n");      b=1;    }

    }   printf("输入姓名:\n");scanf("%s",&q->nam);   printf("输入性别:");scanf("%s",&q->sex);      printf("输入基本工资:\n");scanf("%d",&q->bam);      printf("输入补贴工资:\n"); scanf("%d",&q->inm);      printf("输入扣除工资:\n");scanf("%d",&q->dem);      k=q->bam+q->inm-q->dem;    q->mon=k;      q->next=p->next;   p->next=q;        printf("是否输入另一个数据?\n输入1继续录入,其他键退出\n");      scanf("%d",&c);   getchar();    if(c==1)    { p=q;      charu(head,p);/*递归*/      }    else    {              printf("是否输出数据,输入1输出,其他键退出");             scanf("%d",&m);             if(m==1)    {     printlink(head);    }          getchar();       insert(head);/*到插入选择界面*/    }   
} /*数据删除*/ /*查找删除,记录前结点,然后删除*/ /*选择删除方式*/   void del(Link head)   {int choose=0;   printf("1按编号\n");   printf("2按姓名\n");   printf("3返回上级目录\n");   printf("请输入查询方式:\n");   scanf("%d",&choose);     switch(choose)  {  case 1:delnumber(head);break;  case 2:delname(head);break;  case 3:meau(head);break;  }   } void delnumber(Link head) {  int t,m;  Link p,q;     p=head;     q=p->next;  printf("输入所要删除员工的编号:");  scanf("%d",&t);   while(q!=head)   {  if(q->num==t)  {    p->next=q->next;  
   free(q);    printf("成员已删除\n");    printf("是否输出数据,输入1输出,其他键退出");    scanf("%d",&m);         if(m==1)   {printlink(head);   }      getchar();   meau(head);  }  p=q;  q=q->next;    }   if(q==NULL)        printf("没有数据");     if(q==head)    printf("你想删除的数据不存在");  meau(head);   } void delname(Link head) {   char y[20];   char c[20]="";   char b[20]="";  Link p,q;  int t,k;  int m=0;     q=head;     p=q->next;      printf("请输入所要删除员工的姓名:\n");      scanf("%s",&y);   t=strlen(y);   strncpy(c,y,t);       while(p!=head)        {    strncpy(b,p->nam,t);    if(strcmp(c,b)==0)    {               m=1;       q->next=p->next;            free(p);    p=q->next;    }    q=p;          p=p->next;  
  }   if(m==1)   {    printf("成员已删除\n");          printf("是否输出数据,输入1输出,其他键退出");    scanf("%d",&k);         if(k==1)   {    printlink(head);   }      getchar();   meau(head);   }   else        printf("数据不存在\n");

getchar(); meau(head);

} /*数据读入*/ /*数据读入和存储,本想按最新要求能输入文件路径和文件名,可用字符串来做 失败了,暂时放弃*/ void loadlink(Link head) {  FILE *fp;  int m;  Link p,q;  fp=fopen("dangan.txt","rb");  p=(Link)malloc(sizeof(struct node));  p=head->next;    if((fp)==NULL)  {   printf("不能打开文件\n");      getchar();   meau(head);    }   while(!feof(fp))   {    if(fread(p,sizeof(struct node),1,fp)!=1)   {
   break;   }      p->next=(Link)malloc(sizeof(struct node));       q=p;    p=p->next;    }    q->next=head;    free(p);  fclose(fp);  printf("数据已读入\n");  printf("是否输出数据,输入1输出,其他键退出");    scanf("%d",&m);     if(m==1)     {printlink(head);     }  getchar();  meau(head);

} /*数据保存*/ /*给了现成的,改改就能用,当然也看懂了*/ void savelink(Link head)
{  FILE *fp;  Link p;  p=head->next;  fp=fopen("dangan.txt","wb");  while(p!=head)  {   fwrite(p,sizeof(struct node),1,fp);   p=p->next;  }  printf("数据已保存\n");  fclose(fp);   getchar();  meau(head); }

/*数据统记*/ /*这个最简单,取点累加就行, 就是函数太多,想办法不写这么多函数,不过试了几次不行,先过了再说*/ void tongjixuanze(Link head) {int choose=0;  printf("请选择统记方式\n1按基础工资\n2按补贴工资\n3按扣除工次\n4按总工资");     scanf("%d",&choose); switch(choose)   {    case 1:tongji1(head);break;    case 2:tongji2(head);break;    case 3:tongji3(head);break;    case 4:tongji4(head);break;   } } void tongji1(Link head) {  Link p;  int t,k;  int i=1;     p=head->next;     t=p->bam;  for(;p!=head;p=p->next)  {t=t+p->bam;    
  i++;  }  k=t/i;  printf(" 总基础工资:");  printf("%d\n",t);  printf(" 平均基础工资:");  printf("%d\n",k);   getchar();  meau(head);

} void tongji2(Link head) {  Link p;  int t,k;  int i=1;     p=head->next;     t=p->inm;  for(;p!=head;p=p->next)  { t=t+p->inm;    
   i++;  }  k=t/i;  printf("总补贴工资:");  printf(" %d\n",t);  printf("平均补贴工资:");  printf(" %d\n",k);  getchar();  meau(head);

} void tongji3(Link head) {  Link p;  int t,k;  int i=1;     p=head->next;     t=p->dem;  for(;p!=head;p=p->next)  { t=t+p->dem;    
   i++;  }  k=t/i;  printf("总扣除工资:");  printf(" %d",t);  printf("平均扣除工资:");  printf(" %d\n",k);  getchar();  meau(head); } void tongji4(Link head) {  Link p;  int t,k;  int i=1;     p=head->next;     t=p->mon;  for(;p!=head;p=p->next)  { t=t+p->mon;    
   i++;  }  k=t/i;  printf("总工资:");  printf(" %d\n",t);  printf("平均总工资:");  printf(" %d\n",k);  getchar();  meau(head); }

  /*数据排序*/ /*这个麻烦了,原先想用指针做,总出问题,就用值做了, 冒泡法。 函数太多。想写一个解决,可每个比的项都不一样*/ void paixuxuanze(Link head) {int choose=0;  printf("请选择排序方式\n1按编号\n2按基础工资\n3按补贴工资\n4按扣除工次\n5按总工资");     scanf("%d",&choose); switch(choose)   {    case 1:paixu1(head);break;    case 2:paixu2(head);break;    case 3:paixu3(head);break;    case 4:paixu4(head);break;    case 5:paixu5(head);break;   } }

 void paixu1(Link head) {  Link q,p,t;  int m;  q=head->next;  p=q->next;  t=(Link)malloc(sizeof(struct node));     while(q->next!=head)  {       while(p!=head)    {         if(q->num>p->num)   {          t->num=p->num;           strcpy(t->nam,p->nam);           strcpy(t->sex,p->sex);           t->bam=p->bam;        t->inm=p->inm;t->dem=p->dem;t->mon=p->mon;

    p->num=q->num;     strcpy(p->nam,q->nam);     strcpy(q->sex,q->sex);     p->bam=q->bam;     p->inm=q->inm;p->dem=q->dem;p->mon=q->mon;

    q->num=t->num;     strcpy(q->nam,t->nam);     strcpy(q->sex,t->sex);     q->bam=t->bam;     q->inm=t->inm;q->dem=t->dem;q->mon=t->mon;   }   p=p->next;    }    q=q->next;    p=q->next;  }    printf("排序成功!!!\n");    printf("是否输出数据,输入1输出,其他键退出");    scanf("%d",&m);     if(m==1)     {printlink(head);     }  getchar();  meau(head); }  void paixu2(Link head) {  Link q,p,t;  int m;  q=head->next;  p=q->next;  t=(Link)malloc(sizeof(struct node));     while(q->next!=head)  {       while(p!=head)    {         if(q->bam>p->bam)   {          t->num=p->num;           strcpy(t->nam,p->nam);           strcpy(t->sex,p->sex);           t->bam=p->bam;        t->inm=p->inm;t->dem=p->dem;t->mon=p->mon;

    p->num=q->num;     strcpy(p->nam,q->nam);     strcpy(q->sex,q->sex);     p->bam=q->bam;     p->inm=q->inm;p->dem=q->dem;p->mon=q->mon;

    q->num=t->num;     strcpy(q->nam,t->nam);     strcpy(q->sex,t->sex);     q->bam=t->bam;     q->inm=t->inm;q->dem=t->dem;q->mon=t->mon;   }   p=p->next;    }    q=q->next;    p=q->next;  }    printf("排序成功!!!\n");    printf("是否输出数据,输入1输出,其他键退出");    scanf("%d",&m);     if(m==1)     {printlink(head);     }  getchar();  meau(head); }   void paixu3(Link head) {  Link q,p,t;  int m;  q=head->next;  p=q->next;  t=(Link)malloc(sizeof(struct node));     while(q->next!=head)  {       while(p!=head)    {         if(q->inm>p->inm)   {          t->num=p->num;           strcpy(t->nam,p->nam);           strcpy(t->sex,p->sex);           t->bam=p->bam;        t->inm=p->inm;t->dem=p->dem;t->mon=p->mon;

    p->num=q->num;     strcpy(p->nam,q->nam);     strcpy(q->sex,q->sex);     p->bam=q->bam;     p->inm=q->inm;p->dem=q->dem;p->mon=q->mon;

    q->num=t->num;     strcpy(q->nam,t->nam);     strcpy(q->sex,t->sex);     q->bam=t->bam;     q->inm=t->inm;q->dem=t->dem;q->mon=t->mon;   }   p=p->next;    }    q=q->next;    p=q->next;  }    printf("排序成功!!!\n");    printf("是否输出数据,输入1输出,其他键退出");    scanf("%d",&m);     if(m==1)     {printlink(head);     }  getchar();  meau(head); }    void paixu4(Link head) {  Link q,p,t;  int m;  q=head->next;  p=q->next;  t=(Link)malloc(sizeof(struct node));     while(q->next!=head)  {       while(p!=head)    {         if(q->dem>p->dem)   {          t->num=p->num;           strcpy(t->nam,p->nam);           strcpy(t->sex,p->sex);           t->bam=p->bam;        t->inm=p->inm;t->dem=p->dem;t->mon=p->mon;

    p->num=q->num;     strcpy(p->nam,q->nam);     strcpy(q->sex,q->sex);     p->bam=q->bam;     p->inm=q->inm;p->dem=q->dem;p->mon=q->mon;

    q->num=t->num;     strcpy(q->nam,t->nam);     strcpy(q->sex,t->sex);     q->bam=t->bam;     q->inm=t->inm;q->dem=t->dem;q->mon=t->mon;   }   p=p->next;    }    q=q->next;    p=q->next;  }    printf("排序成功!!!\n");    printf("是否输出数据,输入1输出,其他键退出");    scanf("%d",&m);     if(m==1)     {printlink(head);     }  getchar();  meau(head); }     void paixu5(Link head) {  Link q,p,t;  int m;  q=head->next;  p=q->next;  t=(Link)malloc(sizeof(struct node));     while(q->next!=head)  {       while(p!=head)    {         if(q->mon>p->mon)   {          t->num=p->num;           strcpy(t->nam,p->nam);           strcpy(t->sex,p->sex);           t->bam=p->bam;        t->inm=p->inm;t->dem=p->dem;t->mon=p->mon;

    p->num=q->num;     strcpy(p->nam,q->nam);     strcpy(q->sex,q->sex);     p->bam=q->bam;     p->inm=q->inm;p->dem=q->dem;p->mon=q->mon;

    q->num=t->num;     strcpy(q->nam,t->nam);     strcpy(q->sex,t->sex);     q->bam=t->bam;     q->inm=t->inm;q->dem=t->dem;q->mon=t->mon;   }   p=p->next;    }    q=q->next;    p=q->next;  }    printf("排序成功!!!\n");    printf("是否输出数据,输入1输出,其他键退出");    scanf("%d",&m);     if(m==1)     {printlink(head);     }  getchar();  meau(head); }

/*主目录*/ void meau(Link head) { int choose=20; printf("*******************************************************\n"); printf("*    职工工资管理系统    *      数据结构课程设计      *\n"); printf("*       1密码修改        *           环境             *\n"); printf("*       2数据录入        *    带头结点的单循环链表    *\n"); printf("*       3数据查找        *         计算机系           *\n"); printf("*       4数据插入        *                            *\n"); printf("*       5数据读入        *        信息管理专业        *\n"); printf("*       6数据保存        *                            *\n"); printf("*       7数据统记        *          班级:             *\n"); printf("*       8数据删除        *                            *\n"); printf("*       9数据排序        *         作者:              *\n"); printf("*       0退出系统        *                            *\n"); printf("*    请输入数字选择服务: *        学号:               *\n"); printf("*******************************************************\n"); scanf("%d",&choose); if(choose<0||choose>9) printf("选择错误\n请输入数字选择服务:\n");   switch(choose)   {    case 1:mimaxiugai();break;    case 2:setlink(head);break;    case 3:search(head);break;    case 4:insert(head);break;    case 5:loadlink(head);break;    case 6:savelink(head);break;    case 7:tongjixuanze(head);break;    case 8:del(head);break;    case 9:paixuxuanze(head);break;    case 0:exit(0);break;   } } void main() {Link head;  head=inilink(head);  mimaqueren(head); } /*做完了,最弱智的错是head就没传到功能函数里,一执行某些函数总是内存出错,系统还不告错在哪,从头查几次才找出毛病. 好的习惯很重要,最后说句 其实一个人做反倒比两人快。两人沟通就是个问题,不过也因为一个人做,这方面没学到什么*/

 

posted @ 2013-05-04 09:34  cclient  阅读(495)  评论(0编辑  收藏  举报