亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? sparsematrix.cpp

?? 實(shí)驗1:鏈表的應(yīng)用--求多項式之和 1、實(shí)驗?zāi)康模赫莆諉捂湵淼母鞣N基本操作
?? CPP
字號:
// SparseMatrix.cpp : Defines the entry point for the console application.
// 

#include <stdio.h>

#define MAXSIZE 8
#define MAXRC 8
#define EMPTY 0

typedef int ElemType;

typedef struct Triple{
	int i,j; //行下標(biāo)和列下標(biāo)
	ElemType e;
}Triple; //三元組

typedef struct TSMatrix{
	Triple data[MAXSIZE+1];//丟棄0號單元
	int rpos[MAXRC+1]; // 各行第一個非零元素的位置表
	int rowNum; //行數(shù)
	int colNum; //列數(shù)
	int totalNum;//非零遠(yuǎn)個數(shù)
}TSMatrix;

void CreateSMatrix(TSMatrix &TSM,char *path)
{
	int i,row;
	FILE *fp=fopen(path,"r");
	fscanf(fp,"%d",&TSM.totalNum);
	fscanf(fp,"%d %d",&TSM.rowNum,&TSM.colNum);
	for(i=1;i<=TSM.rowNum;i++)
		TSM.rpos[i]=EMPTY;

	for(i=1;i<=TSM.totalNum;i++)
	{
		fscanf(fp,"%d %d %d",&TSM.data[i].i,&TSM.data[i].j,&TSM.data[i].e);
		row=TSM.data[i].i;
		if(TSM.data[i].i!=TSM.data[i-1].i && TSM.rpos[row]==EMPTY)
			TSM.rpos[row]=i;//紀(jì)錄row行第一個元素
	}

	if(TSM.rpos[TSM.rowNum]==EMPTY) TSM.rpos[TSM.rowNum]=TSM.totalNum+1;

	for(i=TSM.rowNum-1;i>0;i--)
	{
		if(TSM.rpos[i]==EMPTY) TSM.rpos[i]=TSM.rpos[i+1];
	}
}

void Evaluate(Triple Source,Triple &Target) //一個節(jié)點(diǎn)的值賦給另一個節(jié)點(diǎn)
{
	Target.i=Source.j;
	Target.j=Source.i;
	Target.e=Source.e;
}

void DestroySMatrix(TSMatrix &TSM)
{
	TSM.rowNum=0;
	TSM.colNum=0;
	TSM.totalNum=0;
}

void PrintSMatrix(TSMatrix TSM) //這個算法有待改進(jìn)
{
	int i,j;
	ElemType a[MAXSIZE+1][MAXSIZE+1];
	for(i=1;i<=TSM.rowNum;i++)
		for(j=1;j<=TSM.colNum;j++)
			a[i][j]=0;
	for(i=1;i<=TSM.totalNum;i++)
	{
		a[TSM.data[i].i][TSM.data[i].j]=TSM.data[i].e;
	}
	for(i=1;i<=TSM.rowNum;i++)
	{
		for(j=1;j<=TSM.colNum;j++)
			printf("%2d ",a[i][j]);
		printf("\n");
	}
}

void TransposeSMatrix(TSMatrix Source,TSMatrix &Target)
{//轉(zhuǎn)置比較難的就是要把三元組的次序重排(按i從小到大,在前提上j從小到大)
 //O(colNum * rowNum)
	int i,j,k,row;
	Target.colNum=Source.rowNum;
	Target.rowNum=Source.colNum;
	Target.totalNum=Source.totalNum;

	for(i=1;i<=Target.rowNum;i++)
		Target.rpos[i]=EMPTY;

	for(i=1,k=1;i<=Target.rowNum;i++) //一行一行地搜索
	{
		for(j=1;j<=Target.totalNum;j++)
		{
			if(Source.data[j].j==i)
			{
				Evaluate(Source.data[j],Target.data[k]);
				
				row=Target.data[k].i;
				if(Target.data[k].i!=Target.data[k-1].i && Target.rpos[row]==EMPTY)
					Target.rpos[row]=k;//紀(jì)錄row行第一個元素
				k++;
			}
		}
	}

	if(Target.rpos[Target.rowNum]==EMPTY)Target.rpos[Target.rowNum]=Target.totalNum+1;

	for(i=Target.rowNum-1;i>0;i--)
	{
		if(Target.rpos[i]==EMPTY) Target.rpos[i]=Target.rpos[i+1];
	}
}

void FastTransponseSMatrix(TSMatrix Source,TSMatrix &Target) //很巧妙的算法
{
	//用兩個輔助向量加速轉(zhuǎn)置
	//O(colNum + rowNum)
	int num[MAXSIZE+1];//i列元素個數(shù)
	int cpot[MAXSIZE+1];//目標(biāo)矩陣中i列第一個元素的位置
	int i,j,k;

	Target.colNum=Source.rowNum;
	Target.rowNum=Source.colNum;
	Target.totalNum=Source.totalNum;

	for(i=1;i<=Source.colNum;i++) num[i]=0;
	for(i=1;i<=Source.totalNum;i++)
	{
		k=Source.data[i].j;
		num[k]++;//第k列的元素個數(shù)增加
	}
	cpot[1]=1; //原矩陣第一列行第一個元素在 目標(biāo)矩陣中是第一行第一個元素,data[1]

	for(i=2;i<=Source.colNum;i++)
		cpot[i]=cpot[i-1]+num[i-1];
	for(i=1;i<=Source.totalNum;i++)
	{
		k=Source.data[i].j;
		j=cpot[k]++;//該列第一個元素在target中的位置
		//其實(shí)經(jīng)過++這個操作,也就可一看作是data[i]這個元素在target中的位置
		//因為每一次加一,表示這列的下個元素成為該列第一個元素,且位置要在target中推后一個
		Evaluate(Source.data[i],Target.data[j]);
	}
	for(i=1;i<=Source.colNum;i++)
	{
			Target.rpos[i]=cpot[i]; //復(fù)制紀(jì)錄位置到位
	}
}

void MultSMatrix(TSMatrix M,TSMatrix N,TSMatrix &Q)
{
	int mRow,nRow,i,j,k,tp,tp2;
	int ctemp[MAXRC];//這是用來存儲當(dāng)前行的工作數(shù)據(jù),不用二維數(shù)組的原因是沒必要浪費(fèi)空間
	Q.rowNum=M.rowNum;
	Q.colNum=N.colNum;
	Q.totalNum=0;
	for(mRow=1;mRow<=M.rowNum;mRow++) //對應(yīng)的M的每一行,從求值的角度上來講是對應(yīng)Q的每一行逐行求解
	{
		for(i=1;i<=Q.colNum;i++) ctemp[i]=0; //初始化ctemp

		Q.rpos[mRow]=Q.totalNum+1;//aRow行的當(dāng)前元素是以前的元素總數(shù)加1
		if(mRow<M.rowNum) tp=M.rpos[mRow+1]; //tp的作用是找出m行當(dāng)前的最后一個+1的元素的位置,故此種情況等于下行的起始位置
		else tp=M.totalNum+1; //這種情況就等于總數(shù)+1,因為他沒有下一行了
		//順便說一下,+1是為了統(tǒng)一tp的定義,方便下面的求解
		
		for(i=M.rpos[mRow];i<tp;i++) 
		{
			nRow=M.data[i].j; //元素對應(yīng)N中的行號
			//這樣處理是因為data[i]注定要和Nj行的每個元素都想乘一次,故這里動態(tài)規(guī)劃了下
			//經(jīng)典算法是m中的i行乘以n中的j列得到q中的ij元素
			//由于不方便找本列下1行的元素,就只能先行乘行,再綜合起來
			if(N.rpos[nRow]==EMPTY) 
				break;//這行語句也很重要的,因為我的存儲結(jié)構(gòu)中該行沒有元素就定義為EMPTY

			if(nRow<N.rowNum) tp2=N.rpos[nRow+1];
			else tp2=N.totalNum+1;

			for(j=N.rpos[nRow];j<tp2;j++) //到這里可以看出,就是逐個求i*j的
			{
				k=N.data[j].j;//乘積元素在Q中的列號
				ctemp[k]+=M.data[i].e*N.data[j].e;
			}
		}//對應(yīng)求得q的每一行,花費(fèi)時間是m*n

		//以下開始將結(jié)果轉(zhuǎn)移到q上,這里才壓縮
		for(k=1;k<=Q.colNum;k++)
		{
			if(ctemp[k]!=0)
			{
				//書上這里還有一句判斷是否超過該結(jié)構(gòu)最大容納的節(jié)點(diǎn)數(shù)的條件
				j=++Q.totalNum;
				Q.data[j].i=mRow;
				Q.data[j].j=k;
				Q.data[j].e=ctemp[k];
			}
		}
	}
}

int main()
{
	TSMatrix myMatrix,tranMatrix,resMatrix;
	CreateSMatrix(myMatrix,"data.txt");
	printf("原矩陣:\n");
	PrintSMatrix(myMatrix);

	printf("\n矩陣的轉(zhuǎn)置:\n");
	TransposeSMatrix(myMatrix,tranMatrix);
	PrintSMatrix(tranMatrix);

	printf("\n矩陣的快速轉(zhuǎn)置:\n");
	DestroySMatrix(tranMatrix);
	FastTransponseSMatrix(myMatrix,tranMatrix);
	PrintSMatrix(tranMatrix);

	printf("\n矩陣M:\n");
	CreateSMatrix(myMatrix,"M.txt");
	PrintSMatrix(myMatrix);
	printf("矩陣N:\n");
	CreateSMatrix(tranMatrix,"N.txt");
	PrintSMatrix(tranMatrix);
	printf("M與N相乘結(jié)果:\n");
	MultSMatrix(myMatrix,tranMatrix,resMatrix);
	PrintSMatrix(resMatrix);

	getchar();
	return 0;
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美经典一区二区| 日韩欧美综合在线| 国产一区二区三区黄视频 | 日韩激情一二三区| 亚洲一区在线视频观看| 亚洲一区二区在线视频| 一区二区不卡在线播放| 亚洲一本大道在线| 日本不卡不码高清免费观看 | 欧美在线看片a免费观看| av一二三不卡影片| 欧美性受极品xxxx喷水| 在线观看亚洲精品| 欧美一二三在线| 久久综合久久鬼色中文字| 国产欧美精品国产国产专区| 国产精品另类一区| 亚洲一区二区三区自拍| 丝袜亚洲另类欧美| 国产资源精品在线观看| aaa欧美日韩| 欧美日韩一区成人| 精品国产1区二区| 亚洲人成网站在线| 免费欧美高清视频| 东方aⅴ免费观看久久av| 国产成人免费在线| 久久国产精品露脸对白| 国产一区二区免费视频| 成人在线视频一区| 欧美午夜宅男影院| 日韩精品一区二区三区四区视频 | 欧美一区二区免费视频| www国产成人| 亚洲一二三四区| 另类小说欧美激情| 色婷婷久久久综合中文字幕| 欧美久久久久久久久久| 国产日本欧美一区二区| 亚洲国产精品久久久久婷婷884| 久久99精品国产| 欧美在线啊v一区| 国产日韩欧美电影| 首页亚洲欧美制服丝腿| 成人免费av资源| 日韩免费性生活视频播放| 国产精品二区一区二区aⅴ污介绍| 日韩国产欧美在线播放| 91无套直看片红桃| 国产日韩欧美综合一区| 午夜国产精品影院在线观看| 国产91综合一区在线观看| 欧美裸体一区二区三区| 亚洲色图另类专区| 国产成人超碰人人澡人人澡| 日韩一级片网站| 亚洲综合成人在线| 99精品黄色片免费大全| 欧美精品一区二区蜜臀亚洲| 亚洲一级不卡视频| av电影在线观看完整版一区二区| 26uuu亚洲| 中文字幕中文在线不卡住| 免费xxxx性欧美18vr| 欧美网站大全在线观看| 亚洲三级小视频| 成人在线视频首页| 久久久久九九视频| 国产精品一二三在| 国产亚洲欧美色| 精品一区二区三区在线播放视频| 日韩午夜精品视频| 久久国产人妖系列| 日韩欧美一区二区免费| 日韩avvvv在线播放| 在线观看视频一区二区 | 丝袜亚洲另类欧美| 欧美日韩国产电影| 亚洲综合成人在线视频| 色婷婷久久综合| 性欧美疯狂xxxxbbbb| 91久久精品一区二区三区| 一区二区三区美女视频| 在线这里只有精品| 日韩电影在线观看电影| 欧美一级日韩不卡播放免费| 欧美a级一区二区| 欧美v亚洲v综合ⅴ国产v| 国产精品一区二区久激情瑜伽| 精品国产欧美一区二区| 国产一区日韩二区欧美三区| 国产亚洲欧美色| 91香蕉视频黄| 日韩 欧美一区二区三区| 欧美成人aa大片| 成人免费视频播放| 一区二区三区欧美久久| 欧美精品乱码久久久久久| 久久精品国产第一区二区三区| 精品国产伦一区二区三区观看体验 | 欧美天堂亚洲电影院在线播放| 婷婷综合久久一区二区三区| 欧美精品一区在线观看| 91亚洲国产成人精品一区二区三| 一区二区在线看| 91麻豆精品91久久久久久清纯| 精品一区二区影视| 一区二区三区在线免费| 欧美xxxx老人做受| 91丨porny丨国产入口| 调教+趴+乳夹+国产+精品| 国产性色一区二区| 欧美日韩亚洲综合一区二区三区| 琪琪一区二区三区| 91精品国产综合久久精品性色| 国产精品一区二区三区四区| 中文字幕人成不卡一区| 欧美女孩性生活视频| 成人激情免费视频| 久久精品国产第一区二区三区| 综合婷婷亚洲小说| 国产亚洲综合色| 欧美电影影音先锋| 91麻豆免费看| 国产福利一区二区| 久久不见久久见中文字幕免费| 亚洲欧洲日韩一区二区三区| 精品国产乱码久久久久久影片| 欧美视频日韩视频在线观看| 国产在线精品一区二区三区不卡 | 欧美一区日韩一区| 色婷婷av一区二区三区之一色屋| 国产成人啪午夜精品网站男同| 五月天久久比比资源色| 亚洲欧美日韩久久| 亚洲欧洲精品一区二区三区| 精品成人一区二区| 日韩欧美一区二区不卡| 欧美美女网站色| 精品视频在线免费看| 91蝌蚪国产九色| www.色综合.com| av不卡一区二区三区| 国产一区二区导航在线播放| 毛片av一区二区三区| 日韩**一区毛片| 蜜臀av性久久久久蜜臀aⅴ | 欧美成人三级电影在线| 欧美日韩成人一区二区| eeuss国产一区二区三区| 懂色av中文一区二区三区 | 亚洲小少妇裸体bbw| 伊人婷婷欧美激情| 亚洲午夜久久久久久久久电影院 | 懂色av中文字幕一区二区三区| 狠狠色丁香婷婷综合久久片| 美女网站色91| 国产一区二区三区四区五区入口 | 亚洲chinese男男1069| 亚洲一区自拍偷拍| 亚洲第四色夜色| 男女男精品视频| 国产一区二区三区国产| 国产在线精品一区二区三区不卡 | 国产一区 二区| 国v精品久久久网| av亚洲产国偷v产偷v自拍| 国产高清不卡一区二区| 99久精品国产| 欧美三级欧美一级| 日韩精品一区二区三区四区| 久久久不卡网国产精品二区| 国产精品三级av在线播放| 亚洲色图清纯唯美| 日韩黄色片在线观看| 国产自产高清不卡| 色一情一伦一子一伦一区| 3d成人h动漫网站入口| 精品成人一区二区| 一区二区在线观看视频在线观看| 性久久久久久久久久久久| 韩日av一区二区| 色诱视频网站一区| 欧美精品一区二区不卡 | 91精品啪在线观看国产60岁| 久久亚洲精华国产精华液 | 欧美精品久久天天躁| 国产日本欧美一区二区| 亚洲777理论| 99久久免费精品| 日韩欧美中文一区二区| 中文字幕人成不卡一区| 美洲天堂一区二卡三卡四卡视频| av一区二区三区| 日韩精品一区二区三区视频| 国产精品系列在线| 日本不卡一区二区三区高清视频| 成人精品高清在线| 欧美变态口味重另类| 亚洲精品少妇30p|