偏正北海 2022-07-06 15:29 采纳率: 80%
浏览 83
已结题

数据结构链表在文件中提取数据

问题遇到的现象和发生背景

//工资定位
void LocateElem(LinkList L,char x)
{ int buff[255];
char c;
int i=0;
if (!L || !L->next) return;
LinkList p=L->next;
int j=0;
FILE
fp=NULL;
fp=fopen("employee.txt","r");
fscanf(fp,"%d", &buff[i]);
while ((p)&&strcmp(p->data.wages,x)!=0)
{p=p->next; j++;}
if(!p)
printf("没有该信息\n");
else
printf("%d 5个%s\n",&p->data.id,p->data.name,&p->data.birthday,p->data.sex,p->data.address,p->data.education,p->data.wages); //输chu元素值 ,职工号,姓名,出生年月日,性别,住址,学历,工资
}
如何在已经生成的文件里定位数据并与p->data.wages进行比较。

问题相关代码,请勿粘贴截图

#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
//结点类型定义
typedef struct{
int id;//职工号
char name[00];//名字
char sex[10];//性别
char birthday[15];//出生年月
char wages[15];//工资
char address[60];//住址
char education[10];//学历
char positions[10];//职务
} ElemType;
typedef struct node{
ElemType data;
struct node* next;
}LNode,* LinkList;

//函数声明
void ListCreate(LinkList &L,int n); //创建员工基本信息链表
void ListPrint(LinkList L); //浏览员工基本信息
void LocateElem(LinkList L,char *x); //查找 某个员工基本信息
void ListInsert(LinkList &L,ElemType e); //添加员工信息到单链表
void ListDelete(LinkList &L,int x); //删除一个员工信息
void welcome();
//主函数
int main()
{system("color 3f");
int control; // 循环中控制操作
int x; //查找的员工职工号
int n; //欲创建的员工个数
char w[20];
ElemType e={0}; //员工信息
LinkList p=NULL; //工作指针
LinkList L=NULL; //链表头指针
while(1){
printf("请选择功能。1建立。2浏览。3查找。4修改。5删除6退出");
//主循环
scanf("%d", &control);
while(control)
{
switch(control)
{
case 1:
{printf("请输入要创建的员工个数n=");
scanf("%d", &n);
printf("请依次输入员工职工号,姓名,出生年月日,性别,住址,学历,工资。\n数据中间请用空格连接\n");
ListCreate(L,n);
};
break;
case 2:
ListPrint(L);
break;//输出链表内容

case 3:
{
printf("请输入要查找的员工工资\n");
scanf("%s",&w);
LocateElem(L,w);
};
break;
case 4:
{
printf("请输入欲插入的员工信息\n");
scanf("%d5个%s",&p->data.id,p->data.name,&p->data.birthday,p->data.sex,p->data.address,p->data.education,p->data.wages); //输入元素值 ,职工号,姓名,出生年月日,性别,住址,学历,工资
ListInsert(L,e);
};
break;
case 5:
{
printf("请输入欲删除员工的职工号\n");
scanf("%d",&x);
ListDelete(L,x);
};
break;
default:
{
printf("程序结束\n");
exit(0);
}
break;//结束程序
}
printf("0结束程序 1创造链表 2输出链表 3查找 4插入 5删除\n");
scanf("%d",&control);
}
}
return 0;
}

//录入信息
void ListCreate(LinkList &L,int n){
//正位序输入n个元素的值,建立带表头结点的单链表L
LinkList p,r;
int i;
FILE *fp;//文件
fp=fopen("employee.txt","a+");
if (fp == NULL) //判断文件是否成功打开
{
printf("File open failed!\n");
exit(0);
}
L = (LinkList) malloc (sizeof(LNode));
L->next=NULL;
r=L; //尾指针r指向头结点
for(i=0;i<n;++i){
p = (LinkList) malloc (sizeof(LNode)); //生成新结点
scanf("%d5个%s", &p->data.id, p->data.name, p->data.birthday, p->data.sex,p->data.address, p->data.education, p->data.wages);
//输入元素值 ,职工号,姓名,出生年月日,性别,住址,学历,工资
p->next=NULL; r->next=p; //插入到表尾
r=p; //r指向新的尾结点
}
for (p = L->next; p; p = p->next) {
fprintf(fp, "姓名:%s\n性别:%s\n职工号:%d\n", p->data.name, p->data.sex, p->data.id);
fprintf(fp, "出生年月日:%s\n", p->data.birthday);
fprintf(fp, "工资:%s\n住址:%s\n学历:%s\n职务:%s\n\n", p->data.wages, p->data.address,p->data.education, p->data.positions);
}
fclose(fp);
}

//输出链表的值
void ListPrint(LinkList L)
{
if (!L || !L->next) return;
LinkList p=L->next;
if(!p)
printf("没有元素输出\n");
while (p)
{
printf("%d5个%s\n",&p->data.id,p->data.name,&p->data.birthday,p->data.sex,p->data.address,p->data.education,p->data.wages); //输chu元素值 ,职工号,姓名,出生年月日,性别,住址,学历,工资
p=p->next;
}
}

//工资定位
void LocateElem(LinkList L,char x)
{ int buff[255];
char c;
int i=0;
if (!L || !L->next) return;
LinkList p=L->next;
int j=0;
FILE
fp=NULL;
fp=fopen("employee.txt","r");
fscanf(fp,"%d", &buff[i]);
while ((p)&&strcmp(p->data.wages,x)!=0)
{p=p->next; j++;}
if(!p)
printf("没有该信息\n");
else
printf("%d 5个%s\n",&p->data.id,p->data.name,&p->data.birthday,p->data.sex,p->data.address,p->data.education,p->data.wages); //输chu元素值 ,职工号,姓名,出生年月日,性别,住址,学历,工资

}

//插入
void ListInsert(LinkList &L,ElemType e)
{
// 在带头结点的单链线性表L表尾插入元素e
LinkList q,p=L;
while (p->next)
{p=p->next;}
q=(LinkList)malloc(sizeof(LNode));
p->next=q;
q->data=e;
q->next=NULL;
}
//删除
void ListDelete(LinkList &L,int x)
{
LinkList q,p=L;
while ((p->next)&& (p->next->data.id != x))
p=p->next;
if(!p->next)
printf("没有找到学号为%d的学生信息\n",x);
else
{
q=p->next;
p->next=p->next->next;
free(q);
}
}

运行结果及报错内容
我的解答思路和尝试过的方法

读取了文件数据但不知道如何与p->data.wages进行比较

我想要达到的结果

在程序上输入所查找的数据,在文件中找到p->data的数据,在屏幕上打印出来。

  • 写回答

2条回答 默认 最新

  • qzjhjxj 2022-07-06 16:55
    关注

    你可以重新设计下系统的流程,写一个从文件读取数据到链表的函数,进入系统时,先运行此函数进行初始化的工作,然后再实现系统原有的一些功能。然后把链表数据保存到文件的那部分代码单独设计成一个函数,然后在退出系统的时候运行,把数据保存在文件里。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 7月14日
  • 已采纳回答 7月6日
  • 创建了问题 7月6日

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效