从文件中读取一个二维矩阵,,然后把非零元素放入链表中,然后用链表输出矩阵

本文主要的内容为从一个txt文件中读取一个二维矩阵,将非零的元素放入链表中,然后把链表按照矩阵的形式输出出来,下面献上代码,这里我还说说我在编写这段代码时所遇到的一些问题,主要就是刚开始的时候,我把文件中的矩阵元素一个一个读取出来的时候,然后判断其是否非零,非零元素就存入链表,我在调试的时候发现存进去的值是对的,而且也确实存进去了,但是最后输出链表的时候一直都只有一个值,就是文件最后的5,到最后我发现,是因为我在存入链表的时候,我一直是将指针r一直指向链表的头结点p,然后没有判断链表的结点的数,所以没有把指针r往后移到NULL处,所以每次存数据的时候就是后面的一个数据将前面的一个数据覆盖掉了,所以说链表就一直只有一个结点,就只输出了一个值,还有就是将链表按照矩阵的形式输出的时候,因为链表中没有元素零,所以在输出的时候要将零补进去,所以在存链表数据的时候要在定义两个结构来存这个数据在矩阵中行列的位置,然后将链表的遍历放到两个for循环的里面,然后判断输出时候的i和j是否与链表中所存的位置一直,如果是,则输出链表中的data,不是就输出零,所以这里就实现了链表的矩阵输出。

在运行这代码之前必须要人为的写一个名字为matrix1.txt的txt文件,里面写一个数组,这样才有文件可读,当然这里的文件名可以人为的改一下,然后只用定义一个字符数组来存输入的文件名即可。

#include<stdio.h>
#include<stdlib.h>
int row = 0,col = 0;
typedef struct Node {
	int data;
	int row;
	int col;
	struct Node *next;
}Node,*Pnode;
void InitNode(Pnode p) {  //初始化链表 
	p->next = NULL;
}
void add_Node(Pnode p,int x,int i,int j) {  //插入数据到链表中 
	Pnode r = p,s;
	while (r->next)
		r = r->next;
	s = (Pnode ) malloc (sizeof (Node));
	s->data = x;
	s->row = i;
	s->col = j;
	r->next = s;
	r = s;
	r->next = NULL;
}
void read_File(Pnode p,char *file_name) {  //读取文件中的矩阵元素 
	int value = 0;
	FILE *fp;
	if ((fp = fopen (file_name,"r")) == NULL) {
		printf ("不能打开文件!\n");
		exit (0);
	}
	fscanf (fp,"%d%d",&row,&col);
	for (int i = 0; i < row; i++) {
		for (int j = 0; j < col; j++) {
			fscanf (fp,"%d",&value);
			if (value == 0) continue;
			add_Node(p,value,i,j);
		}
	}
	fclose (fp);
}
void Printf_Node(Pnode p) {  //输出链表 
	Pnode r = p;
	while (r->next != NULL) {
		printf ("第%d行第%d列的非零元素为%d\n\n",(r->next)->row+1,(r->next)->col+1,(r->next)->data);
		r = r->next;
	}
	printf ("其矩阵为:\n");
	for (int i = 0; i < row; i++) {
		for (int j = 0; j < col; j++) {
			int t = 0;
			r = p;
			while (r->next != NULL) {  //遍历链表 查看是否变量为零 
				if (((r->next)->row == i)&&((r->next)->col == j)) {
					printf ("%4d",(r->next)->data);
					t = 1;
					break;
				}
				r = r->next;
			}
			if (!t)  //未找到变量,输出零 
				printf ("%4d",t);
		}
		printf ("\n");
	}
}
int main () {
	char fname [20] = {"matrix1.txt"};
	Pnode p;
	p = (Pnode) malloc (sizeof (Node));
	InitNode(p);
	read_File(p,fname);
	Printf_Node(p);
	return 0;
}



然后我这里还自行的扩展一下:
从两个文件中读取两个矩阵,然后将其相加后存入链表,然后按照矩阵的形式输出链表,并把该矩阵写入另外的一个文件中。

这里就相当于只多了一个将链表矩阵写入文件的操作,但是在写入文件的时候一定要注意换行,在第一行写入完成之后再写入一个换行的指令即可,基本思路与上同。不过写入文件的时候要保证该文件名和文件一定存在。下面献上代码。

#include<stdio.h>
#include<stdlib.h>
int row = 0,col = 0;
typedef struct Node {
	int data;
	int row;
	int col;
	struct Node *next;
}Node,*Pnode;
void InitNode(Pnode p) {  //初始化链表 
	p->next = NULL;
}
void add_Node(Pnode p,int x,int i,int j) {  //插入数据到链表中 
	Pnode r = p,s;
	while (r->next)
		r = r->next;
	s = (Pnode ) malloc (sizeof (Node));
	s->data = x;
	s->row = i;
	s->col = j;
	r->next = s;
	r = s;
	r->next = NULL;
}
void read_File(Pnode p,char *file_name1,char *file_name2) {  //读取文件中的矩阵元素 
	int value1 = 0,value2 = 0;
	int row2 = 0,col2 = 0;
	FILE *fp1,*fp2;
	if ((fp1 = fopen (file_name1,"r")) == NULL) {
		printf ("不能打开matrix1.txt文件!\n");
		exit (0);
	}
	if ((fp2 = fopen (file_name2,"r")) == NULL) {
		printf ("不能打开matrix2.txt文件!\n");
		exit (0);
	}
	fscanf (fp1,"%d%d",&row,&col);
	fscanf (fp2,"%d%d",&row2,&col2);
	if ((row != row2)||(col != col2)) {
		printf ("两个矩阵的类型不同!\n");
		exit (0);
	}
	for (int i = 0; i < row; i++) {
		for (int j = 0; j < col; j++) {
			fscanf (fp1,"%d",&value1);
			fscanf (fp2,"%d",&value2);
			add_Node(p,value1+value2,i,j);
		}
	}
	fclose (fp1);
	fclose (fp2);
}
void Printf_Node(Pnode p) {  //输出链表 
	Pnode r = p;
	FILE *fp3;
	int t = 0;
	while (r->next != NULL) {
		printf ("第%d行第%d列的非零元素为%d\n",(r->next)->row+1,(r->next)->col+1,(r->next)->data);
		r = r->next;
	}
	if ((fp3 = fopen ("matrix3.txt","w")) == NULL) {
		printf ("不能打开matrix3.txt文件!\n");
		exit (0);
	}
	fprintf (fp3,"%d %d\n",row,col);
	for (int i = 0; i < row; i++) {
		for (int j = 0; j <col; j++) {
			r = p;
			while (r->next != NULL) {
				if (((r->next)->row == i)&&((r->next)->col == j)) {
					fprintf (fp3,"%d ",(r->next)->data);
					break;
				}
				r = r->next;
			}
			
		}
		fprintf (fp3,"\n");
	}
	fclose (fp3);
	printf ("\n以写入文件matrix3.txt,文件内容如下:\n");
	for (int i = 0; i < row; i++) {
		for (int j = 0; j < col; j++) {
			int t = 0;
			r = p;
			while (r->next != NULL) {  //遍历链表 查看是否变量为零 
				if (((r->next)->row == i)&&((r->next)->col == j)) {
					printf ("%4d",(r->next)->data);
					t = 1;
					break;
				}
				r = r->next;
			}
			if (!t)  //未找到变量,输出零 
				printf ("%4d",t);
		}
		printf ("\n");
	}
}
int main () {
	char fname1 [20] = {"matrix1.txt"};
	char fname2 [20] = {"matrix2.txt"};
	Pnode p;
	p = (Pnode) malloc (sizeof (Node));
	InitNode(p);
	read_File(p,fname1,fname2);
	Printf_Node(p);
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值