数据结构之数组

数组本身就是一种数据结构,他是对线性表的一种扩充数组主要用于对矩阵的压缩和表示

一.特殊矩阵的压缩

二.稀疏矩阵的压缩

     1.三元组表示法:

#include<stdio.h>
#define MAXSIZE 1000
typedef int ElemType;
//定义一种结构体记录每个压缩后的非零点在原矩阵中的行下标和列下标,以及数据
typedef struct Node{
	int row,col;
	ElemType data;
}Triple;
//定义一种结构体:新的压缩矩阵,包含所有原矩阵非零点的数组,
//原矩阵的行数,列数,新压缩矩阵非零点的个数
typedef struct YS{
	Triple data[MAXSIZE+1];//data[0]抛弃不用
	int m,n,len;
}TSMatrix;

  

            三元组表示法下的稀疏矩阵转置

                    

#include<stdio.h>
#define MAXSIZE 1000
typedef int ElemType;
//定义一种结构体记录每个压缩后的非零点在原矩阵中的行下标和列下标,以及数据
typedef struct Node{
	int row,col;
	ElemType data;
}Triple;
//定义一种结构体:新的压缩矩阵,包含所有原矩阵非零点的数组,
//原矩阵的行数,列数,新压缩矩阵非零点的个数
typedef struct YS{
	Triple data[MAXSIZE+1];//data[0]抛弃不用
	int m,n,len;
}TSMatrix;

//矩阵转置 :列序递增转置法
void TransposTSMatrix(TSMatrix A,TSMatrix B)
{
	int i,j=1,k;
	if(B.len>0)
	{

		for(k=1;k<A.n;k++)
			for(i=1;i<A.len;i++)
				if(A.data[i].col==k)
				{
					B.data[j].row=A.data[i].col;
					B.data[j].col=A.data[i].row;
					B.data[j].data=A.data[i].data;
					j++;
				}

	}
}

//一次定位快速转置法
void FastTransportTSMatrix(TSMatrix* A,TSMatrix* B)
{
	int col,t,p,q;
	int num[MAXSIZE],postion[MAXSIZE];//num[i]记载A中第i列中非零元素个数,
//postion[i]中记载A中第i列中下一个非零元素在三元组表B中的正确存放位置
	B->len=A->len;
	B->n=A->m;
	B->m=A->n;
	if(B->len)
	{
		//初始化每列中的非零元素个数为0
		for(col=1;col<=A->len;i++)
			num[col]=0;
		//计算出A每列中非零元素的个数
		for(t=1;t<=A->len;t++)
			num[A->data[t]->col]++;
		//第一列中第一个非零元素在B中的位置
		potion[1]=1;
		//计算出每列中第一个非零元素在三元组表B中的正确存放位置
		for(col=2;col<=A->n;col++)
		postion[col]=postion[col-1]+num[col-1];

		//依次将A中每一个元素按照列序转置
		for(p=1;p<=A->len;p++)
		{
			col=A->data[p]->col;q=postion[col];
			B->data[q]->col=A->data[p]->row;
			B->data[q]->row=A->data[p]->col;
			B->data[q]->data=A->data[p]->data;
			postion[col]++;
		}

	}

}

      

  二.稀疏矩阵的链式存储结构:十字链表

建立十字链表

#include<stdio.h>
typedef ElemType int;
typedef struct OLNode
{
	int row,col;
	ElemType value;
	struct OLNode* right,*down;
}OLNode,*OLink;
typedef struct TS
{
	//行链表,列链表的头指针向量
	OLink row_head,col_head;
	int m,n,len;//稀疏矩阵的行数,列数,非零元素的个数
}CrossList;

  

        

时间: 2024-12-14 18:13:06

数据结构之数组的相关文章

数据结构之数组与字符串

一.数组 (题目与程序摘自<剑指offer>) 数组可以说是最简单的一种数据结构,它占用一块连续的内存并按照顺序存放.创建数组时我们需要知道数组的容量大小,然后根据大小分配内存. 由于不管有多少元素,数组都会为全部数据预算内存,所以空间效率不高:但是,由于数组中的内存是连续的,可以根据下标在O(1)时间读写任何元素,时间效率极高. 数组和指针是相互联系又相互关联,又有区别的两个概念.需要注意的是,使用指针访问数据库中的元素的时候,需要确保没有超出数组的边界. 例题:二维数组中的查找 void 

数据结构3——数组、集合

1:数组是所有高级语言中必备的数据结构储存类型,但是数组有一个明显的缺点:必须提前知道数组内存的大小.这对于需要动态扩展的情况而言,无疑是一个弊端. 因此创造了一个Vector 类来扩展数组的内存大小. 1 package com.hone.set; 2 3 //总体的操作集合:扩充数组内存大小,添加,删除,修改,查找 4 public class MyVector { 5 6 private Object[] elementData; //定义一个数组 7 private int elemen

【数据结构】数组操作(LowArrayApp.java)

1 // LowArrayApp.java 2 // demonstrates array class with low-level interface 3 // to run this program: C>java LowArrayAPP 4 //java数据结构和算法(第二版)拉佛 著 pdf第46页 数组操作 5 6 package first; 7 8 class LowArray 9 { 10 private long[] a; // ref to array a 11 12 pub

【数据结构】数组操作(HighArrayApp.java)

1 // java 数据结构和算法第二版 拉佛 著 2 // 数组的操作 3 4 package first; 5 6 class HighArray { 7 private long[] a; 8 private int nElems; 9 10 public HighArray(int max) { 11 a = new long[max]; 12 nElems = 0; 13 } 14 15 public void insert(long value) { 16 a[nElems] = v

剑指offer-第二章数据结构(数组,字符串,链表,树,栈与队列)及例题

一.数组(最简单的数据结构) 定义:占据一块连续内存并按照顺序存储数据.创建时先指定大小,分配内存. 优点:时间效率高.实现简单的hash(下标为key,对应的数据为value) 缺点:空间效率差.如果我们只在数组中存一个数字,也先分配所有的内存. 扩展:动态数组(解决空间效率差),手段:扩容后,复制内容到新的数组,释放之前的内存.时间性能变差,因此,要尽量减少改变数组容量的次数. 数组与指针:声明一个数组时,数组名字也是一个指针,指向数组的第一个元素. 例题:在一个二维数组中,每一行都按照从左

Java数据结构之数组

自定义数组(面向对象编程): 直接上代码: package com.xingej.algorithm.datastructure.array; /**  * 面向对象编程  *   * 自定义类数组  *   * 你一定要明白,这是在JDK基础之上的封装,要学会这种思路,其他框架如netty 也是在前者的基础上封装而来的,如有一  *   * 部分是封装的线程池  *   * @author erjun 2017年11月28日 下午9:42:10  */ public class MyArray

用js来实现那些数据结构(数组篇03)

终于,这是有关于数组的最后一篇,下一篇会真真切切给大家带来数据结构在js中的实现方式.那么这篇文章还是得啰嗦一下数组的相关知识,因为数组真的太重要了!不要怀疑数组在JS中的重要性与实用性.这篇文章分为两部分,第一部分会给大家简单说一下数组原生的排序方法sort和reverse.第二部分会给大家简单说一下二维和三维数组.都不难,仔细看,很简单的. 1.reverse() reverse比较容易理解,颠倒数组中元素的顺序,也就是第一个变成最后一个,最后一个呢变成第一个. var nums = [0,

数据结构之----数组

数组: 数组是最简单,也是使用最广泛的数据结构.栈,队列等其他数据结构均由数组演变而来. 例如: 1 2 3 4 5 这是一个包含5个元素的简单数组,数组长度为5.每个数组元素都关联一个正数值称为索引,它表明每个元素所在的位置. 特点: 数组是相同数据类型的元素的集合 数组中各个元素的存储是有先后顺序的,它们在内存中开辟一块连续的存储空间按照这个先后顺序连续存放在一起. 数组元素用数组的名字+它在数组中的位置明确表示,例如:arr[0] ,表示数组第一个元素. 类型: 一维数组. 多维数组. J

数据结构 - 基于数组的队列

队列Queue *队列也是一种线性结构 *相比于数组,队列对应的操作是数组的子集 *只能从一端(队尾)添加元素,从另一端(队首)取出元素 *队列是一种先进先出的数据结构(先到先得 First In First Out) 基于数组的队列实现的源码如下: package queue; public interface Queue<E> {        public void enqueue(E e);        public E dequeue();        public E getF