1. 程式人生 > >C語言檔案讀取並寫入連結串列

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);//將連結串列的各個節點值打印出來
}