职工信息管理系统中的数据保存问题
程序代码:
/*****************************************************************************************
* 职工信息包括职工号、姓名、性别、年龄、学历、工资、住址、电话等(职工号不重复)。 *
* 试设计一职工信息管理系统,使之能提供以下功能: *
* 1)系统以菜单方式工作 *
* 2)职工信息录入功能(职工信息用文件保存)--输入 *
* 3)职工信息浏览功能--输出 *
* 4)职工信息查询功能--算法 *
* 查询方式: *
* ①按学历查找 *
* ②按职工号查找 *
* 5)职工信息删除、修改功能 *
* *
* *
* *
*****************************************************************************************/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>
#define LEN sizeof(work)
typedef struct worker
{
long no;//职工号
char name[10];
char sex[1];
int age;
char edu[5];//学历
float wages;
char address[30];
long long number;//电话
struct worker *next;
}work;
int n;
//函数声明区
work *creat(void);//创建链表
work *input(work *head,work *p1);//输入职工信息
work *insert(work *head,work *workd);//插入职工信息
work *changes(work *head);
work *del(work *head, long num);
void search(work *head);
void save(work *head);//保存职工信息到文件
void print(work *head);//打印出职工信息
void numsearch(work *head,long num);
void namesearch(work *head,char name[]);
//函数编写区
work *creat(void)//新建职工信息
{
work *head,*p1;
n=0;
p1=(work *)malloc(LEN);
printf("请输入职工信息!\n");
head=NULL;
p1=input(head,p1);
while(p1->no!=0)
{
head=insert(head,p1);
p1=(work *)malloc(LEN);
p1=input(head,p1);
}
return head;
}
work *input(work *head,work *p1)//输入职工信息
{
int i,f,k,j;
work *p2;
loop:printf("职工号(输入0返回上一级): ");
scanf("%ld",&p1->no);
if(p1->no<0)
{
printf("职工号不能为负,请重新输入!\n");
goto loop;
}
else
{
if(p1->no==0)
return (p1);
else
{
p2=head;
f=0;
for(i=1;i<=n;i++)
{
if(p1->no==p2->no)
{
f=1;
break;
}
p2=p2->next;
}
}
if(f)
{
printf("职工号重复,请重新输入!\n");
goto loop;
}
}
printf("姓名:");
scanf("%s",p1->name);
printf("性别:");
scanf("%s",&p1->sex);
printf("年龄:");
scanf("%d",&p1->age);
printf("学历:");
scanf("%s",p1->edu);
printf("工资:");
scanf("%f",&p1->wages);
printf("家庭住址:");
scanf("%s",p1->address);
printf("联系方式:");
scanf("%lld",&p1->number);
return (p1);
}
work *insert(work *head,work *workd)
{
work *p0,*p1,*p2;
p1=head;//指向链表头部
p0=workd;//指向要插入的结点
if(head==NULL)//如果为空,直接插入到第一个结点
{
head=p0;
p0->next=NULL;
}
else
{
while((p0->number>p1->number)&&(p1->next!=NULL))
{
p2=p1;
p1=p1->next;
}
if(p0->number<=p1->number)
{
if(head==p1)//插入的结点在第一个结点之前
head=p0;
else//插入的结点在中间
p2->next=p0;
p0->next=p1;
}
else//插入的结点在最后
{
p1->next=p0;
p0->next=NULL;
}
}
n=n+1;;
return (head);
}
work *changes(work *head)
{
work *p1;
int k;
long num;
do{
printf("1.删除 2.插入 0.返回上一级\n");
printf("请选择:");
scanf("%d",&k);
switch(k)
{
case 1:if(n==0)
{
printf("数据库为空,没有职工信息!!\n");
break;
}
else
do{
printf("请输入要删除的职工的职工号(职工号应为整数,输入0时跳出删除元素):");
scanf("%ld",&num);
if(num>0)
head=del(head,num);
if(num<0)
printf("职工号不能为负,请重新输入!\n");
}while(num!=0);
break;
case 2:printf("请输入学生信息:\n");
p1=(work *)malloc(LEN);
p1=input(head,p1);
while(p1->no!=0)
{
head=insert(head,p1);
printf("请输入学生信息:\n");
p1=(work *)malloc(LEN);
p1=input(head,p1);
}
break;
case 0:
break;
default:printf("输入错误,请重新输入!\n");
}
}while(k!=0);
return head;
}
work *del(work *head,long num)
{
work *p1,*p2;
if(head==NULL)
{
printf("数据库为空,没有职工信息!\n");
}
else
{
p1=head;
while(p1->no!=num&&p1->next!=NULL)
{
p2=p1;
p1=p1->next;
}
if(num==p1->no)
{
if(p1==head)
{
head=p1->next;
printf("删除成功!\n");
}
else
{
p2->next=p1->next;
printf("删除成功!\n");
}
n=n-1;
free(p1);
}
else
printf("没有找到职工号为%d的职工信息!\n",num);
}
return head;
}
void print(work *head)//打印职工信息
{
int j;
work *p1;
if(n==0)
{
printf("数据库为空!\n");
return;
}
p1=head;
if(head!=NULL)
{
do{
printf("职工号:%ld\n",p1->no);
printf("姓名:%s\n",p1->name);
printf("性别:%s\n",p1->sex);
printf("年龄:%d\n",p1->age);
printf("学历:%s\n",p1->edu);
printf("薪水:%f\n",p1->wages);
printf("家庭住址:%s\n",p1->address);
printf("联系方式:%lld\n",p1->number);
p1=p1->next;
}while(p1!=NULL);
}
}
void save(work *head)//保存文件时候有问题
{
FILE *fp;
work *p1;
if(n==0)
{
printf("没有职工信息!请先建立职工信息!!\n");
return;
}
if((fp=fopen("职工信息.txt","r+"))==NULL)
{
printf("不能打开文件!!\n");
exit(0);
}
for(p1=head;p1!=NULL;p1=p1->next)
{
fprintf(fp,"职工号:%ld\n姓名:%s\n性别:%s\n年龄:%d\n学历:%s\n薪水:%f\n家庭住址:%s\n联系方式:%lld\n",p1->no,p1->name,p1->sex,p1->age,p1->edu,p1->wages,p1->address,p1->number);
//职工数据写入文件中
printf("保存成功!\n");
fclose(fp);
}
}
void search(work *head)
{
int k;
long num;
char name[10];
if(n==0)
{
printf("数据库为空,没有职工信息!!\n");
return;
}
else
{
do{
printf("1.按职工号查找 2.按姓名查找 0.返回上一级\n");
printf("请选择:");
scanf("%d",&k);
switch(k)
{
case 1:do{
printf("职工号(输入0时跳出):");
scanf("%ld",&num);
if(num>0)
numsearch(head,num);
if(num<0)
printf("输入错误,请重新输入!\n");
}while(num!=0);
break;
case 2:do{
printf("姓名(输入0时跳出):");
scanf("%s",name);
namesearch(head,name);
}while(strcmp(name,"0")!=0);
break;
default:printf("输入错误,请重新输入!\n");
}
}while(k!=0);
}
}
void numsearch(work *head,long num)
{
work *p1;
p1=head;
while(p1!=NULL)
{
if(num==p1->no)
{
printf("职工号:%ld\n",p1->no);
printf("姓名:%s\n",p1->name);
printf("性别:%s\n",p1->sex);
printf("年龄:%d\n",p1->age);
printf("学历:%s\n",p1->edu);
printf("薪水:%f\n",p1->wages);
printf("家庭住址:%s\n",p1->address);
printf("联系方式:%lld\n",p1->number);
return;
}
p1=p1->next;
}
printf("没有找到该职工的信息\n");
}
void namesearch(work *head,char name[])
{
int a=1;
work *p1;
p1=head;
while(p1!=NULL)
{
if(strcmp(name,p1->name)==0)
{
printf("职工号:%ld\n",p1->no);
printf("姓名:%s\n",p1->name);
printf("性别:%s\n",p1->sex);
printf("年龄:%d\n",p1->age);
printf("学历:%s\n",p1->edu);
printf("薪水:%f\n",p1->wages);
printf("家庭住址:%s\n",p1->address);
printf("联系方式:%lld\n",p1->number);
a=0;
}
p1=p1->next;
}
if(a)
printf("没有找到该职工的信息\n");
}
void main()//菜单
{
int choice;
work *head;
head=NULL;
do{
printf("*******************************************************************************\n");
printf("^_^_^_^_^_^_^_^_^_^_^_^_^_^欢迎来到职工信息管理系统!^_^_^_^_^_^_^_^_^_^_^_^_^_^\n");
printf(" \n");
printf(" 职工信息管理系统的基本功能: \n");
printf(" 1. 新建; \n");
printf(" 2. 查找; \n");
printf(" 3. 更新; \n");
printf(" 4. 显示; \n");
printf(" 5. 存盘; \n");
printf(" 0. 跳出; \n");
printf(" \n");
printf(" 按键选择,回车确定! \n");
printf("^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^\n");
printf("*******************************************************************************\n");
printf("请选择:");
scanf("%d",&choice);
switch(choice)
{
case 1: head=creat();
break;
case 2: search(head);
break;
case 3: head=changes(head);
break;
case 4: print(head);
break;
case 5: save(head);
break;
case 0: printf("谢谢你的使用!!\n");
break;
}
}while(choice!=0);
}
在输入多次数据之后,文件保存的时候就只保存最后一次的输入数据,还有在插入数据的时候,插入多组数据,也只是保存最后一次数据。问问大佬们错在了哪里~~~~~~
【不知道怎么回事代码复制上去格式有点乱,希望大佬们不要介意】
[此贴子已经被作者于2017-5-6 11:34编辑过]




