数据结构-文件处理

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

bdfunction.h

#pragma once
#include <stdio.h>
#include<stdlib.h>
#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<stdarg.h>
#include<string.h>
#include "bdfunction.h"
#define   malloc mymalloc
#define free myfree


void 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;
	else
		return 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<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"bdfunction.h"
#include<process.h>

char 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;
	else
		return 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");
}
上一篇:7.5_链表_链表中添加结点


下一篇:队列的链式实现