|
发表于 2013-4-23 16:07:18
|
显示全部楼层
大哥,你的代码逻辑有点惨不忍睹,链表函数里面,逻辑有点混乱。那里我帮你小改一下,没有大改,另外,我把读写改成了fwrite和fwrite了。代码如下- #define _CRT_SECURE_NO_WARNINGS
- #include<stdio.h>
- #include<stdlib.h>
- #define ZJ sizeof(data)
- struct data *lianbiao();
- void baochun(struct data *p);
- void puchu();
- struct data
- {
- int a;
- char m[20];
- int g;
- struct data *e;
- };
- struct data *lianbiao() //建立链表
- {
- struct data *p,*x,*y;
- printf("输入工人数据以工号‘0’结束\n");
- p = x = y =(struct data *)malloc(ZJ);
- while(y->a)
- {
- printf("输入工号 ");
- scanf("%d",&y->a);
- if(y->a != 0)
- {
- printf("输入名字 ");
- scanf("%s",&y->m);
- printf("输入工资 ");
- scanf("%d",&y->g);
- x = y;
- y = (struct data *)malloc(ZJ);
- x -> e = y;
- }
- else x -> e = NULL;
- }
- if (y == p)
- {
- p = NULL;
- free(y);
- y = NULL;
- }
-
-
- return p;
- } //
- void baochun(struct data *p) //将建立的链表保存到文件 (只保存工号工资)
- {
- if (!p)
- {
- return;
- }
-
- char a[20];
- FILE *fp = NULL;
- printf("输入创建文件的目录和名字\n");
- scanf("%s",a);
- if((fp = fopen(a,"wb")) == NULL)
- {
- printf("文件建立失败\n");
- exit(0);
- }
- printf("保存工号和工资\n");
- if (!p->a)
- {
- free(p);
- fclose(fp);
- }
-
- while(p)
- {
- //fprintf(fp,"%d,%d",p->a,p->g);
- int nCount = fwrite(&(p->a),sizeof(int),1,fp);
- nCount = fwrite(&(p->g),sizeof(int),1,fp);
-
- printf("%d,%d\n",p->a,p->g);
- p = p -> e;
- }
- free(p);
- fclose(fp);
- }
- void puchu() //取出工号工资进行删除操作
- {
- char a[20];
- FILE *fp;
- struct data *p,*y,*x;
- printf("输入读取文件的目录和名字\n");
- scanf("%s",a);
- if((fp = fopen(a,"rb+")) == NULL)
- {
- printf("打开文件失败\n");
- exit(0);
- }
- p = y = x = (struct data *)malloc(ZJ);
- int nCount = fread(&(y->a),sizeof(int),1,fp);
- nCount = fread(&(y->g),sizeof(int),1,fp);
- while(!feof(fp)) /*取出的数据是乱码,且可能无限循环*/
- {
- //读完最后一个字符后,fp->flag仍然没有被置为_IOEOF,因而feof()仍然没有探测到文件结尾。直到再次调用fgetc()执行读操作,feof()才能探测到文件结尾。这样就多输出了一个
- printf("%d,%d\n",y->a,y->g);
- int nCount = fread(&(y->a),sizeof(int),1,fp);
- nCount = fread(&(y->g),sizeof(int),1,fp);
-
- x = y;
- y = (struct data *)malloc(ZJ);
- x -> e = y;
- }
- x -> e = NULL;
- free(y);
- }
- int main(int argc, _TCHAR* argv[])
- {
- struct data *lb;
- lb = lianbiao();
- baochun(lb);
- puchu();
- while (1)
- {
- int d = 0;
- scanf("%d",&d);
- if (1 == d)
- {
- break;
- }
- }
- return 0;
- }
复制代码 建议把头指针和其他的指针区分开来。单独写createHead 和addNode函数 |
|