我解决了一天的文件问题 还没解决 真求了!
#include#define len sizeof(Linklist)
typedef struct worker
{
int num;
char name[20];
char sex;
int age;
char tele[12];
char xueli[20];
int salary;
struct worker*next;
}Linklist;
void main()
{
Linklist*creat(); /**********创建链表************/
void menu(); /**********菜单界面************/
void show(); /**********输出全部职工信息************/
Linklist* insert(); /**********添加职工************/
void revise(); /**********修改职工的信息************/
void ccode(); /***********修改密码***********/
menu();
}
void menu()
{
int choose,i;
static flag=0,flag1=0;
char *p1;
int *p2; /*密码 和 标志 都改变其值*/
char code[10],change[]="520",ch;
Linklist *head;
p1=change;
p2=&flag;
Start: /*******这里的 goto语句 为了让密码 不在重置******/
printf(" Workers Information Query System\nPlease give the code to enter the System:");
for(;flag==0;)
{
for(i=0;(ch=getch())!='\r'&&i<10;i++) /*********职工进入密码的一段代码***********/
{
code[i]=ch;
printf("*");
}
code[i]='\0'; /* 记住在这里的后面加上一个结束的标识符*/
if(strcmp(code,p1)==0) /*这里用不用指针都没有关系*/
{
flag=1;
}
else
printf("\nSorry! the code you give is wrong,please re-enter it as confirmation:\n");
}
if(flag1==0) /********这里是创建一个链表 每次从文件里面取出数据进行创建,每次运行程序的时候只能创建一次 所有标志(尾插法创建链表)**********/
{
head=creat();
flag1++;
}
system("cls");
printf(" Workers Information Query System\nPlease choose the survice as follow:\n 1.Information for all workers\n 2.Workers search\n 3.Change the information of workers\n");
printf(" 4.Adding workers\n 5.Password reset\n 6.Dismiss workers\n 7 End");
scanf("%d",&choose);
switch(choose)
{
case 1:show(head);break; /*************输出全部职工的信息 用链表的方法***************/
case 3:revise(head);
break; /*****************用链表 修改职工里面的信息******************/
case 4:head=insert(head); /********这里是添加职工信息 用的还是链表的插入法************/
system("pause");
system("cls");
menu();
break;
case 5:ccode(p1,p2);goto Start; /*********修改密码的一个函数**********/
}
}
void show(Linklist*head)
{
Linklist*p1;
p1=head;
system("cls");
printf(" num name sex age");
for(;p1!=NULL;)
{
printf("\n%2d %-11s% 2c%7d",p1->num,p1->name,p1->sex,p1->age); /**********输出整个链表************/
p1=p1->next;
}
system("pause");
system("cls");
menu();
}
void revise(Linklist*head) /*现在只是执行了 找一次的程序*/
{
Linklist*p1;
int num,i,choose,age;
char sex,name[10];
FILE*fp;
if((fp=fopen("d:\z.txt","w"))==NULL)
{
printf("open error");
exit(1);
}
p1=head;
system("cls");
printf("Please choose which ways you wanna seek workers to revise their information?\n1.num 2.name"); /***********这里按照名字和数字的方法查找修改***********/
scanf("%d",&choose);
switch(choose) /*这里没有选择的bug也要进行修改, 第 2次进行 选择修改的 时候指针的志向要进行修改一下 */
{
case 1:printf("\nPlease input the num :"); /***********按照数字的方法查找***********/
scanf("%d",&num);
for(;p1!=NULL;p1=p1->next)
{
if(p1->num==num)
{
printf("\nTHE original information of the worker:");
printf("\n%2d %-11s% 2c%7d",p1->num,p1->name,p1->sex,p1->age);
printf("\nwhich do you wanna to revise?\n 1.name 2.age 3.sex\n"); /**********修改的哪一个方面************/
scanf("%d",&choose);
switch(choose)
{
case 1:printf("Please give the new name:"); /***********把修改的数据再存入次链表当中***********/
scanf("%s",name);
strcpy(p1->name,name);
break;
case 2:printf("Please give the new age:");
scanf("%d",&age);
p1->age=age;
break;
case 3:printf("Please give the new sex:");
fflush(stdin);
scanf("%c",&sex);
p1->sex=sex;
break;
}
break; /**********找到后可以直接跳出了***********/
}
}
break;
case 2: printf("Please input the worker's name :"); /**********按照名字的方式查找并且修改************/
scanf("%s",name);
for(;p1!=NULL;p1=p1->next)
{
if(strcmp(p1->name,name)==0)
{
printf("\nTHE original information of the worker:");
printf("\n%2d %-11s% 2c%7d",p1->num,p1->name,p1->sex,p1->age);
printf("\nwhich do you wanna to revise?\n 1.name 2.age 3.sex\n");
scanf("(%d)",&choose);
switch(choose)
{
case 1:printf("Please give the new name:");
scanf("%s",name);
strcpy(p1->name,name);
break;
case 2:printf("Please give the new age:");
scanf("%d",&age);
p1->age=age;
break;
case 3:printf("Please give the new sex:");
fflush(stdin);
scanf("%c",&sex);
p1->sex=sex;
break;
}
}
}
}
for(p1=head;p1!=NULL;p1=p1->next) /****** 将改变后的链表存入文件********/
{
if(fwrite(p1,sizeof(Linklist),1,fp)!=1)
{
printf("eqweq");
exit(1);
}
}
fclose(fp);
system("pause");
system("cls");
menu();
printf("Succee!\n");
}
Linklist*insert(Linklist*head)
{
FILE *fp;
Linklist*p1,*p2,*p3; /*p3进行创建一个新的节点*/
int k,n,flag,num,age,salary;
char tele[12],name[10],sex,xueli[10];
system("cls");
if((fp=fopen("d:\z.txt","w"))==NULL)
{
printf("open error");
exit(1);
}
printf(" Welcome to the adding system\n How many workers do you wanna add in?\n");
p1=p2=head;
p1=p1->next;
scanf("%d",&n);
for(k=0;knum&&num>p2->num) /***********找到了刚好在中间的位置***********/
{
flag=1;
break;
}
if(p1==NULL) /***********并没有找到中间的位置 输入的编号直接按照大小直接放在最后面***********/
{
flag=2;
break;
}
if(num==p2->num||num==p2->num) /**********这里是输入了相同的编号 指针初始化 要求重新输入 在进行插入*********/
{
printf("the num has been register,Please input another one:");
scanf("%d",&num);
p1=p2=head;
p1=p1->next;
}
}
p3=(Linklist*)malloc(len); /*********存入插入的节点数据**********/
p3->num=num;
printf("name:");
scanf("%s",name);
strcpy(p3->name,name);
printf("\nage:");
scanf("%d",&age);
p3->age=age;
getchar();
printf("\nsex:");
scanf("%c",&sex);
p3->sex=sex;
printf("\ntele:");
scanf("%s",tele);
strcpy("p3->tele.tele");
printf("\nxueli:");
scanf("%s",xueli);
strcpy(p3->xueli,xueli);
printf("\nsalary:");
scanf("%d",&salary);
p3->salary=salary;
if(flag==1) /**********中间位置插入*********/
{
p2->next=p3;
p3->next=p1;
}
if(flag==2) /*********末尾插入**********/
{
p2->next=p3;
p3->next=NULL;
}
p1=p2=head;
p1=p1->next;
}
for(p1=head;p1!=NULL;p1=p1->next) /****** 将改变后的链表存入文件********/
{
if(fwrite(p1,sizeof(Linklist),1,fp)!=1)
{
printf("eqweq");
exit(1);
}
}
fclose(fp);
return head;
}
void ccode(char *p1,int *p2)
{
char old[10], new[10];
printf("Please input the old password:"); /*********修改密码系统比较简单**********/
/*gets(old);*/
scanf("%s",old);
if(strcmp(old,p1)!=0)
{
menu(); /*如果输入不正确 就要返回菜单 这个设置 应该在完善一下*/
}
else
{
printf("Please input the new password:");
/*gets(new);*/
scanf("%s",new);
strcpy(p1,new);
*p2=0;
}
printf("Succee!\n");
system("pause");
system("cls");
}
Linklist*creat()
{
Linklist*head,*p1,*p2;
FILE*fp;
if((fp=fopen("d:\z.txt","r"))==NULL)
{
printf("open error");
exit(1);
}
p1=p2=(Linklist*)malloc(len);
p1->num=0;
strcpy(p1->name,"Edward");
p1->sex='M';
p1->age=19;
strcpy(p1->tele,"83355367");
strcpy(p1->xueli,"daxue");
p1->salary=10;
head=p1;
p1=(Linklist*)malloc(len);
p2->next=p1;
p2=p1;
p2->num=1;
strcpy(p1->name,"peter");
p1->sex='M';
p1->age=19;
strcpy(p1->tele,"83312467");
strcpy(p1->xueli,"daxue");
p2->salary=10;
p1=(Linklist*)malloc(len);
while(fread(p1,sizeof(Linklist),1,fp)==1) /*********再从文件读入数据进行插入链表 现在文件暂时为空**********/
{
p2->next=p1;
p2=p1;
p1=(Linklist*)malloc(len);
}
p2->next=NULL;
free(p1);
fclose(fp); /******最后还开辟了一个空间但是没有使用*******/
return head;
}
这段程序是在是TC下写的(文件暂时什么东西都没)
关键问题在于修改函数。每次修改了数据以后 在执行了menu();以后就自动把我head释放了 太奇怪了 再修改函数还没有增加文件之前 都是正常的
跪求啊 解决了一天了! 30分