数据结构实验四_二维数组基本操作的编程实现(C语言)

一、实验题目

二维数组基本操作的编程实现

二、题目要求

二维数组基本操作的编程实现,掌握数组的建立、读取数据、压缩存储等基本操作的编程实现,存储结构可以在顺序结构或链接结构中任选,也可以全部实现。也鼓励学生利用基本操作进行一些应用的程序设计。

三、运行结果

在这里插入图片描述
在这里插入图片描述

四、程序基本功能

1、矩阵生成

对于矩阵的生成,我采用了两种方式,第一种为随机生成,第二种为文件导入,其实之前我打算加入第三种人工输入的,我认为文件导入其实就包括了人工输入,所以放弃了这种方法。

(1)随机生成矩阵

函数名:arraycreate1()
描述:随机生成一个1x1—20x20的矩阵,并且非零元大约为总数的20%。
入口参数:无
出口参数:无
说明:函数执行之后,我首先随机生成了随机行row和随机列col,然后确定存储随机矩阵大小的二维数组,接着控制非零元的个数count在总数的20%左右。然后初始化row*col二维数组全为0,通过一个for循环随机生成一个数据,该数据的十位存为行rowc,该数据的个位存为列colc,然后为二维数组array[rowc][colc]随机赋值。部分重要代码如下:

	row=rand()%20+1;
	col=rand()%20+1;
	int data[row*col/5];
	do
	{
   
		srand(time(NULL)); //避免每次产生相同的随机数
		if(row*col/5==0)   //行数*列数<5
		{
   
			count=1;
		}
		else
		count=rand()%(row*col/5); //非零数的个数 
	}while(count<(row*col/5-3)); 
	for(i=0;i<row;i++)
	for(j=0;j<col;j++)
	{
   
		array[i][j]=0;		//数组初始化为0 
	}
	for(i=0;i<count;i++)	//随机为count个数赋值 
	{
   
		data[i]=rand()%100;
		rowc=data[i]/10;
		colc=data[i]%10;
		do
		{
   
			array[rowc][colc]=rand()%100;	
		}while(array[rowc][colc]<10);
	}
	printf("随机%dx%d矩阵已生成!\n",row,col);

(2)文件导入矩阵

函数名:arraycreate2()
描述:从文件导入一个1x1—20x20的矩阵。
入口参数:无
出口参数:无
说明:首先在“文件导入矩阵数据.txt”文件中输入符合规格的矩阵。先判断此文件是否存在,不存在即退出,否则开始读取数据,进入while循环,当文件读取结束时结束循环。While循环中读入字符ch,判断字符ch是否是空格或者回车,如果是空格j++,如果是回车i++。用i,j最终的值确定文件中的行列数。再次读取文件,确定行列数之后,用fscanf()函数读取数据,录入所在的行列。最后关闭文件。部分重要代码如下:

	if((fp=fopen("文件导入矩阵数据.txt","r"))==NULL)
	{
   
		printf("文件打开失败!\n");
		exit(0);
	}
    while (!feof(fp))       
	{
    
		ch=fgetc(fp);
	    if(ch==' ')  
		{
   
    		j++;
    		continue;
		}
	    if(ch=='\n')
		{
   
	    	i++;
	     	continue;
		}
	}
	row=i+1;
	col=j/(i+1);
	fp=fopen("文件导入矩阵数据.txt", "r");
	for(i=0;i<row;i++)
	for(j=0;j<col;j++)
	{
   
		fscanf(fp,"%d",&array[i][j]);
	}
	printf("\n矩阵导入完成!\n");
	fclose(fp);

文件导入矩阵数据.txt

 1 1 1 0 0
 2 2 2 0 0
 3 3 3 0 0
 4 4 4 0 0

(3)矩阵压缩三元组

函数名:arraycompress()
描述:将矩阵中的非零元压缩成三元组。
入口参数:无
出口参数:无
说明:由于行row,列col均是全局变量,所以开始定义一个rowcol大小的结构体数组(struct compress data[rowcol]),通过两个for循环判断当array[i][j]==0时将i赋值给data[count+1].row,将j赋值给data[count+1].col,array[i][j]赋值给data[count+1].number。每添加一组数据count++。然后把行row,列col,count赋值给data[0],即矩阵压缩三元组成功。部分重要代码如下:

	for(i=0;i<row;i++)
	{
   
		for(j=0;j<col;j++)
		{
   
			if(array[i][j]!=0)
			{
   
			data[count+1].row=i;
			data[count+1].col=j;
			data[count+1].number=array[i][j];
			count++;
			}
		}
	}
	data[0].row=row;
	data[0].col=col;
	data[0].number=count;

2、三元组生成

三元组生成有两种方式,随机生成三元组和文件导入三元组.

(1)随机生成三元组

函数名:groupcreate1()
描述: 随机生成一个三元组
入口参数:无
出口参数:无
说明:首先随机生成矩阵的行row,列col,和非零元的个数count,并且非零元的个数限制在总数的20%,将行、非零元的个数存在data[0]中。然后定义一个value[count+1],随机生成count个0- -(row-1)*(col-1)大小的数,为了让三元组中数据是有序的,通过冒泡法将value这个一维数组中我的数据排序,之后将每个数的十位作为该组数据的行,个位数作为列,之中判断该行该列是否重复,通过一个判断重复函数来判断,然后随机为该行该列的非零元随机赋值。部分重要代码如下:

	row=rand()%10+1;
	col=rand()%10+1;
	count=rand()%((row*col+1)/5);
	int value[count+1];
	struct compress data
  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值