C语言文件读取并写入链表

C语言实现

#include "stdio.h"
#include "stdlib.h"



/*****************************
	链表节点结构体
****************************/
typedef struct link_node {
	int ID;
	char name;
	int Yuwen;
	int Shuxue;
	int	Yingyu;
	int Dili;
	int	Shengwu;
	struct link_node *next;
}node;


/*****************************
向控制台输出链表的各个节点值
****************************/
void dispaly(node *head) 
{
	node *p;
	p = head;
	if (!p) //如果head指针为空说明链表为空
	{
		printf("\n链表为空!\n\n");
	}
	else
	{
		printf("\n链表的各个节点的值为:\n");
		while (p)  //循环将各个节点值输出
		{
			p = p->next;//第一是垃圾值   跳过  
			printf("%d  %c	%d	%d	%d	%d	%d\n",p->ID, p->name, p->Yuwen, p->Shuxue, p->Yingyu, p->Dili, p->Shengwu);//打印
			
		}
	}

}



/******************************************
找到要插入的上一个节点位置,实际就是连续插入在尾部
*********************************************/
node *find(node *head,int i) 
{
	int j = 1;
	node *p = head;
	
	if (i < 1) //节点从第一个开始   为0说明没有节点 链表为空  返回NULL
	{
		printf("\n链表长度要大于零\n\n");
		return NULL;
	}

	while (p&&i!=j) //循环判断直到找到目标节点
	{
		p = p->next;
		j++;
	}

	return p;//返回找到的目标节点
}



/******************************************
插入节点,找到要插入的位置后插入带数据的节点
*********************************************/
node *insert(node *head, int ID,char name,int Yuwen,int Shuxue,int	Yingyu,int Dili,int	Shengwu,int i)
{
	node *p, *q;
	q = find(head, i);

	if (!q&&i!=0)  //对find的结果进行判断,同时对i输入的值判断  
	{
		printf("找不到第%d个节点,无法插入数据\n",i);
	}
	else
	{
		p = (node*)malloc(sizeof(node));//实例化节点,分配空间
		p->ID = ID;  //将文件读出来的值赋值给节点的数据域
		p->name = name;
		p->Yuwen = Yuwen;
		p->Shuxue = Shuxue;
		p->Yingyu = Yingyu;
		p->Dili = Dili;
		p->Shengwu = Shengwu;
		if (i == 0) //如果是空链表   就把这个节点作为头指针指向的节点
		{
			p->next = head;
			head = p;
		}
		else  //如果不是空链表就正常代换指针域
		{
			p->next = q->next;
			q->next = p;
		}
	}
	return head;//返回修改后的链表头指针
} 

/***********主函数*************/
void main() 
{
	//链表初始化
	node *head,*s;
	head = (node*)malloc(sizeof(node)); //例化

	//文件读取
	FILE *fp;
	int i = 0;
	int j = 0;
	int ID[9], YW[9], SX[9], YY[9], DL[9], SW[9];//接收文件读出来的数据
	char  name[9];
	//char locationfile[80];//文件路径
	//char ch;
	//printf("请输入文件绝对路径:");
	//scanf("%s", locationfile);
	fp = fopen("test.txt","r");//打开文件
	if (fp == NULL) //判断是否正常打开文件
	{
		printf("读取文件失败\n\n");
		exit(0);
	}
	else
	{
		printf("读取文件成功\n\n");
	}
	for (i = 0; i <= 9;i++)  //按照文件里的数据格式  循环的读入每一行的数据,并存入相应的数组缓存中
	{
		fscanf(fp,"%d  %c	%d	%d	%d	%d	%d\n",&ID[i],&name[i],&YW[i],&SX[i],&YY[i],&DL[i],&SW[i]);
	}
	//ch= fgetc(fp);	

	fclose(fp);//操作文件结束必须关闭文件指针

	for (j = 0; j <9; j++)//将数组里的数据打印出来看看是否正确
	{
		printf("%d  %c	%d	%d	%d	%d	%d\n", ID[j], name[j], YW[j], SX[j], YY[j], DL[j], SW[j]);
	}


	for (int m = 1; m <= 9; m++)//循环调用链表插入函数,将数组值写入链表中
	{
		s = insert(head, ID[m-1], name[m-1], YW[m-1], SX[m-1], YY[m-1], DL[m-1], SW[m-1], m);
	}

	dispaly(s);//将链表的各个节点值打印出来
}

    原文作者:皮皮虾打篮球_
    原文地址: https://blog.csdn.net/qq_40731414/article/details/82830486
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞