1
回答
好强大的错误啊,关于文件和链表的,有空的大神帮忙改下错误呗!
滴滴云服务器,限时包月0.9元,为开发者而生>>>   
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
struct worker
{
long num;//员工卡号
char name[10];//姓名
int month;//月份
double yfgz;//应发工资
double sf;//水费
double df;//电费
double sj;//税金
double sfgz;//实发工资
struct worker *next;
};
typedef  struct worker wor;
int read(wor **head)
{
FILE *fp;
wor *s;
wor *p;
int n;
fp=fopen("c:\\2.txt","ab+");//读取文件
if(NULL==fp)//如果打开失败返回-1
{
printf("´打开文件失败¡\n");
*head=NULL;
return -1;
}
*head=(wor *)malloc(sizeof(wor));
p=*head;
while(!feof(fp))
{//为下个节点分配空间
s=(wor *)malloc(sizeof(wor));
n=fread(s,sizeof(wor),1,fp);//´从文件中读取数据到节点
if(n<1)
{
free(s);
p->next=NULL;//置最后一个节点为NULL
break;
}

p->next=s;//保存下个节点

p=p->next;//切换至下个节点

p->next=NULL;//最后一个节点为NULL
}
fclose(fp);
return 0;
}
int save(wor *head)
{
FILE *fp;
wor *p;
fp=fopen("c:\\2.txt","ab+");
if(NULL==fp)
{
printf("打开文件失败\n");
return -1;
}
p=head->next;
do{
fwrite(p,sizeof(wor),1,fp);//把数据保存到fp指向的文件中
p=p->next;
}while(p!=NULL);
fflush(fp);
fclose(fp);
return 0;
}
wor *input(wor *head)
{
wor *s,*p;
if(head==NULL)//如果表头为空,先为它分配内存
{
head=(wor *)malloc(sizeof(wor));
p=head;
}
else//否则说明有内容,直接切换至尾节点
{
p=head;
while(p->next)
p=p->next;
}
s=(wor *)malloc(sizeof(wor));//为这个节点分配内存
printf("请输入员工的卡号:");
scanf("%ld",&s->num);
printf("请输入员工姓名:");
scanf("%s",s->name);
printf(“输入月份:");
scanf("%d",&s->month);
printf("输入应发工资:");
scanf("%ld",&s->yfgz);
printf("输入水费:");
scanf("%ld",&s->sf);
printf("输入电费:");
scanf("%ld",&s->df);
if(s->yfgz<=800)
s->sj=0;
else if(s->yfgz>800&&s->yfgz<1400)
s->sj=(s->yfgz-800)*0.05;
else 
s->sj=(s->yfgz-1400)*0.10;
s->sfgz=s->yfgz-s->sf-s->df-s->sj;
p->next=s;//保存这个节点
p=p->next;//切换至下一节点
p->next=NULL;
printf("添加信息成功");
return head;
}
int find(wor *head)
{
wor *t;
long n;
int found=0;
wor *p=head;
if(head==NULL)
{
printf("没有记录员工信息\n");
return -1;
}
printf("请输入您要查询的卡号:");
scanf("%ld",&n);
while(p->next)
{
t=p;
p=p->next;
if(p->num==n)//查找与n相同号码的员工信息并打印
{
found=1;
printf("%-8ld%-8s%-8d%-8ld%-6ld%-6ld%-6ld%-6ld\n",p->num,p->name,p->month,p->yfgz,p->sf,p->df,p->sj,p->sfgz);
}
}
if(found!=1)
{
printf("没有找到符合要求的员工信息!\n");
return -1;
}
return 0;
}
char menu(void)
{
char ch;
printf(" 欢迎登陆系统\n");
printf("1  输入员工信息\n");
printf("2  查找员工信息\n");
printf("0 退出系统\n");
printf("请输入您的选择:");
scanf(" %c",&ch);
return ch;
}
int main(void)
{
char ch;
wor *head=NULL;
while(1)
{
ch=menu();
switch(ch)
{
case '1': 
head=input(head);
save(head);
break;
case '2':
read(&head);
find(head);
break;
case '0':
exit(0);
break;
default :
printf("输入错误! ");
}
}
return 0;

}

想问下,为什么输入操作时,月份前面的数据可以被存入,而后面的不能呢?大神们,看看输入函数就可以了吧,不会浪费你们太多时间的,拜托!

<无标签>
举报
蔡文豪
发帖于5年前 1回/137阅
顶部