数据结构-文件处理

文件载入内存,生成链表实现查询,删除,修改
student1.txt
182544,陆一在,18911555661
193752,孙训兰,18911555662
197132,程昕,18911555663
205844,王亚威,18911555664

bdfunction.h

#pragma once
#include 
#include
#include"memfunction.h"//内存管理函数的头文件//定义链表结构(指针链表void*)#define FILESIZE 309068//文件大小
#define LMAX 256//行最大数struct strudent//学生信息
{char  name[19];int id;long long int phone;
};typedef struct LinkNode
{void * data;LinkNode * pre;//前驱LinkNode * next;//后续
}*linknode;void addlink(LinkNode **head,void * data);//添加节点
void showlist(LinkNode const *head, void(showcon)(void *));//显示链表
void * dellink(LinkNode **head, int(finddata)(void *));//删除节点void * findlink(LinkNode *head, int(finddata)(void *));//查找节点
void * changelink(LinkNode *head, int(finddata)(void *), void (changedata)(void *));//更改节点int initfiletomem(char *filepath);//文件导入内存

bdfunction.cpp

#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include "bdfunction.h"
#define   malloc mymalloc
#define free myfreevoid addlink(LinkNode **head, void * data)//添加节点
{if ((*head) == NULL) //头节点为空{(*head) = (LinkNode*)malloc(sizeof(LinkNode));(*head)->data = data;(*head)->pre = NULL;(*head)->next = NULL;}else{LinkNode* temp = (*head);while (temp->next != NULL){temp = temp->next;}temp->next= (LinkNode*)malloc(sizeof(LinkNode));temp->next->data = data;temp->next->next = NULL;temp->next->pre = temp;}}void showlist(LinkNode const *head,void(showcon)(void *))
{if (head == NULL){printf("没有内容\n");return;}else{while (head != NULL){//根据链表中的指针打印所对应数据结构的内容,传入一个函数指针showcon(head->data);head = head->next;}}
}void * dellink(LinkNode **head, int(finddata)(void *))//删除节点
{int flag = 0;if ((*head) == NULL){printf("链表没有内容\n");return NULL;}else{LinkNode *temp = (*head);while (temp != NULL){if (finddata(temp->data))//找到元素{if (temp->next == NULL&&temp->pre == NULL)//只有一个元素{temp->data = NULL;free(temp);temp = NULL;(*head) = NULL;}else if (temp->next == NULL)//元素在最后一个{temp->pre->next = NULL;temp->data = NULL;free(temp);temp = NULL;}else if(temp->pre==NULL)	//元素在第一个{(*head) = temp->next;(*head)->pre = NULL;temp->data = NULL;free(temp);temp = NULL;}else //元素在在中间{temp->pre->next = temp->next;temp->next->pre = temp->pre;temp->data = NULL;free(temp);temp = NULL;}flag = 1;break;}temp = temp->next;	}}if (flag == 1)return finddata;elsereturn NULL;
}//dellink_a("%d&%s",id,name)//查找删除id=?跟name=?的链表节点void * findlink(LinkNode *head, int(finddata)(void *))//查找节点
{if (head == NULL){printf("链表没有内容\n");return NULL;}else{LinkNode *temp = head;while (temp != NULL){if (finddata(temp->data))//找到{printf("\n找到的数据地址%p\n", temp->data);return temp->data;break;}temp = temp->next;}printf("没有找到数据\n");return NULL;}
}void * changelink(LinkNode *head, int(finddata)(void *),void (changedata)(void *))//更改节点
{if (head == NULL){printf("链表没有内容\n");return NULL;}else{LinkNode *temp = head;while (temp != NULL){if (finddata(temp->data))//找到{printf("\n找到的数据地址%p\n", temp->data);changedata(temp->data);return temp->data;break;}temp = temp->next;}printf("没有找到数据\n");return NULL;}
}

main.cpp

#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
#include"bdfunction.h"
#includechar filepath[256] = "student1.txt";//定义文件路径
char findstr[19],changestr[19];void showcon(void * ptr)//根据指针地址显示内容
{if (ptr == NULL)return;printf("\n%s,%d,%lld", ((strudent *)ptr)->name, ((strudent *)ptr)->id, ((strudent *)ptr)->phone);
}int fdata(void * ptr)//根据指针查找内容返回找到或没找到
{if (!strcmp(((strudent*)ptr)->name, findstr))return 1;elsereturn 0;
}void cdata(void * cptr)//根据链表地址改变内容
{strcpy(((strudent *)cptr)->name,changestr);
}LinkNode *head = NULL;int initfiletomem(char *filepath)//文件导入内存,创建链表
{//setlocale(LC_ALL, NULL);FILE *pfr = fopen(filepath, "rb");char lstr[LMAX] = { 0 };if (pfr == NULL){printf("文件打开失败");}else{while (!feof(pfr)){fgets(lstr, LMAX, pfr);strudent * st=NULL;st = (strudent *)malloc(sizeof(strudent));int i = 0;char templstr[LMAX] = { 0 };strcpy(templstr,lstr);int lenght = 0;while (templstr[i] != '\0')//取id{	if (templstr[i] == ','){templstr[i] = '\0';lenght = strlen(templstr);st->id= atoi(templstr);break;}i++;}i = 0;strcpy(templstr, lstr + lenght + 1);while (templstr[i] != '\0')//取姓名{if (templstr[i] == ','){templstr[i] = '\0';lenght = lenght+strlen(templstr);strcpy(st->name, templstr);}i++;}strcpy(templstr, lstr + lenght + 2);i = 0;while (templstr[i] != '\0')//取电话{if (templstr[i] == '\r'){templstr[i] = '\0';st->phone = atoll(templstr);}i++;}addlink(&head, st);//加入链表}}printf("文件载入内存成功");fclose(pfr);return 1;
}void main()
{initfiletomem(filepath);//文件载入内存printf("内存使用了字节:%d,多少块:%d\n",mcount().size,mcount().sum);//内存使用情况//查找while (1){printf("\n查找到的数据为:");scanf("%s", findstr);showcon(findlink(head, fdata));//打印找到的数据if (findstr[0] == '#')break;printf("\n");}//删除while (1){printf("\n您要删除的数据为:");scanf("%s", findstr);showcon(findlink(head, fdata));//打印找到的数据dellink(&head, fdata);if (findstr[0] == '#')break;printf("\n");}//更改节点while (1){printf("\n您要改变的数据为:");scanf("%s", findstr);printf("\n改变的数据为");scanf("%s", changestr);changelink(head, fdata, cdata);showcon(findlink(head, fdata));//打印找到的数据if (findstr[0] == '#')break;printf("\n");}system("pause");
}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部