十字链表实现稀疏矩阵,包含十二大功能
生活随笔
收集整理的這篇文章主要介紹了
十字链表实现稀疏矩阵,包含十二大功能
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
題目:
1.問題描述
用十字鏈表存儲和表示稀疏矩陣,并實現(xiàn)如下功能
2.基本要求
實現(xiàn):
技術(shù)難點1:uthash存儲十字鏈表矩陣,給每個矩陣進行命名,以名字作為key,十字鏈表作為value,實現(xiàn)相對自動化的功能;(需要自己在github上找到相關(guān)資源)
技術(shù)難點2:十字鏈表矩陣的插入函數(shù)是整個代碼的核心,需要對十字鏈表的存儲結(jié)構(gòu)比較熟悉
技術(shù)難點3:十字鏈表矩陣的相加函數(shù),針對兩個矩陣不同對應(yīng)的情況進行相加
代碼前面的聲明:
?
#include<iostream> #include<cstdlib> #include<iomanip> #include"uthash.h" using namespace std;/* 稀疏矩陣的十字鏈表存儲 */typedef struct OLNode {int row; //非零元素的行下標(biāo)int col; //非零元素的列下標(biāo)int elem; //非零元素值struct OLNode *right; //右節(jié)點struct OLNode *down; //下節(jié)點}OLNode, *OLink;typedef struct {OLink *rhead; //行指針鏈表OLink *chead; //列指針鏈表int rowSum; //矩陣的行數(shù)int ColSum; //矩陣的列數(shù)int NumSum; //矩陣的非零元素個數(shù) }CrossList; /* uthash哈希表的結(jié)構(gòu)體聲明 */struct HashCross{ //哈希表char name[10]; //矩陣名稱 keyCrossList crosslist; //十字鏈表結(jié)構(gòu)體 valueUT_hash_handle hh; }HashCross;/* 全局hash表,存儲矩陣 */struct HashCross *cross = NULL; /* ************************************************************************** *//* 函數(shù)聲明 */void menu(); //主菜單 void menu1(); //初始化部分 void menu2(); //基礎(chǔ)操作部分 void menu3(); //進階操作部分 void InitSMatrix(CrossList &M); //初始化矩陣 void CreateMatrix(CrossList &M); //創(chuàng)建矩陣 void PrintSMatrix(CrossList M); //輸出矩陣 void InsertElem(OLink &newnode,CrossList &M); //插入元素到矩陣M中 void changeValue(CrossList &M); //尋找矩陣M中的某個值 void findValue(CrossList &M); //查找矩陣中的某個值 void deleteValue(CrossList &M); //刪除矩陣中的某個值 void AddMatrix(CrossList &M,CrossList &N,CrossList &out); //兩個矩陣的相加 void SubtractMatrix(CrossList &M,CrossList &N,CrossList &out); //兩個矩陣的相減 void MultiplyMatrix(CrossList &M,CrossList &N,CrossList &out); //兩個矩陣的相乘 void TransposeSMatrix(CrossList &M, CrossList &out); //矩陣的轉(zhuǎn)置 void findMaxOrMin(CrossList &M); //矩陣求最值 void CopySMatrix(CrossList &M, CrossList &out); //復(fù)制矩陣 void ReadFromFile(CrossList &M); //從文件中讀取矩陣 void WriteToFile(CrossList &M); //把矩陣寫入文件 CrossList HashFind(char *name); //哈希查找函數(shù)(沒有該矩陣,手動創(chuàng)建) CrossList HashFind2( char *name); //哈希查找函數(shù)(沒有該矩陣,文件讀取創(chuàng)建) CrossList getCrossList(); //控制臺獲取矩陣名稱(沒有該矩陣,手動創(chuàng)建)/* ************************************************************************** */具體每個功能的函數(shù):
/* 實現(xiàn)功能的函數(shù) *//* 1. 主菜單 */ void menu() {int c=0;printf("--------------------------------------------------------------------------------\n");printf("******************<-----歡迎使用十字鏈表存儲的稀疏矩陣進行操作----->*****************\n\n");printf("\t\t\t 1.*--<矩陣初始化>--*\n\n");printf("\t\t\t 2.*--<矩陣基本操作(插入、刪除、查找)>--*\n\n");printf("\t\t\t 3.*--<矩陣進階操作(四則運算、求逆、求轉(zhuǎn)置、求最值等)>--*\n\n");printf("\t\t\t 4.*--<退出本程序>--*\n\n");printf("\n\n********************************************************************************\n");printf("--------------------------------------------------------------------------------\n");printf("*請輸入相應(yīng)功能的編號:");do{cin >> c;if(c<1||c>4)printf("*無該選項!請重新輸入:");}while(c<1||c>4);switch(c){case 1:menu1();break;case 2:menu2();break;case 3:menu3();break;case 4:exit(0);break;} }/* ************************************************************************** *//* 2.初始化菜單 */ void menu1() {int c=0;while(c != 1){printf("--------------------------------------------------------------------------------\n");printf("******************<-----歡迎來到矩陣初始化菜單----->*****************\n\n");printf("\t\t\t 1.*--<返回主菜單>--*\n\n");printf("\t\t\t 2.*--<手動輸入矩陣>--*\n\n");printf("\t\t\t 3.*--<從文件中讀取矩陣>--*\n\n");printf("\t\t\t 4.*--<退出本程序>--*\n\n");printf("\n\n********************************************************************************\n");printf("--------------------------------------------------------------------------------\n");printf("*請輸入相應(yīng)功能的編號:");do{cin >> c;if(c<1||c>4)printf("*無該選項!請重新輸入:");}while(c<1||c>4);switch(c){case 1:menu();break;case 2:{getCrossList();break;}case 3:{CrossList M;printf("請輸入需要操作的矩陣名稱:(長度小于10)\n");char name[10];cin >> name;M = HashFind2(name); break;}case 4:exit(0);break;}} }/* ************************************************************************** *//* 3. 矩陣基本操作菜單 */void menu2() { int c=0;while(c != 1){printf("--------------------------------------------------------------------------------\n");printf("******************<-----歡迎來到矩陣基本操作菜單----->*****************\n\n");printf("\t\t\t 1.*--<返回主菜單>--*\n\n");printf("\t\t\t 2.*--<查看矩陣下標(biāo)的值>--*\n\n");printf("\t\t\t 3.*--<刪除矩陣下標(biāo)的值>--*\n\n");printf("\t\t\t 4.*--<增加矩陣下標(biāo)的值>--*\n\n");printf("\t\t\t 5.*--<退出本程序>--*\n\n");printf("\n\n********************************************************************************\n");printf("--------------------------------------------------------------------------------\n");printf("*請輸入相應(yīng)功能的編號:");do{cin >> c;if(c<1||c>5)printf("*無該選項!請重新輸入:");}while(c<1||c>5);switch(c){case 1:menu();break;case 2:{CrossList M;M = getCrossList(); findValue(M);break;}case 3:{CrossList M;M = getCrossList();deleteValue(M);break;}case 4:{CrossList M;M = getCrossList();changeValue(M);break;} case 5:exit(0);break;}} }/* ************************************************************************** *//* 4. 矩陣進階操作菜單 */void menu3() {int c=0;while(c != 1){printf("--------------------------------------------------------------------------------\n");printf("******************<-----歡迎來到矩陣進階操作菜單----->*****************\n\n");printf("\t\t\t 1.*--<返回主菜單>--*\n\n");printf("\t\t\t 2.*--<求稀疏矩陣的加法>--*\n\n");printf("\t\t\t 3.*--<求稀疏矩陣的減法>--*\n\n");printf("\t\t\t 4.*--<求稀疏矩陣的乘法>--*\n\n");printf("\t\t\t 5.*--<求稀疏矩陣的轉(zhuǎn)置>--*\n\n");printf("\t\t\t 6.*--<輸出稀疏矩陣>--*\n\n");printf("\t\t\t 7.*--<求稀疏矩陣的最值>--*\n\n");printf("\t\t\t 8.*--<將稀疏矩陣存入文件>--*\n\n");printf("\t\t\t 9.*--<退出本程序>--*\n\n");printf("\n\n********************************************************************************\n");printf("--------------------------------------------------------------------------------\n");printf("*請輸入相應(yīng)功能的編號:");do{cin >> c;if(c<1||c>9)printf("無該選項!請重新輸入:");}while(c<1||c>9);switch(c){case 1:menu(); break;case 2:{CrossList M,N,out;M = getCrossList();N = getCrossList();AddMatrix(M,N,out);break;}case 3:{CrossList M,N,out;M = getCrossList();N = getCrossList();SubtractMatrix(M,N,out);break;}case 4:{CrossList M,N,out;M = getCrossList();N = getCrossList();MultiplyMatrix(M,N,out);break;}case 5:{CrossList M,out;M = getCrossList();TransposeSMatrix(M,out);break;}case 6:{CrossList M;M = getCrossList();PrintSMatrix(M); break;} case 7:{CrossList M;M = getCrossList();findMaxOrMin(M);break;}case 8:{CrossList M;M = getCrossList();WriteToFile(M);break;} case 9:exit(0);break;}} } /* ************************************************************************** *//* 5. 初始化稀疏矩陣 */void InitSMatrix(CrossList &M){M.rhead = (OLink *)malloc((M.rowSum+1)*sizeof(OLink));M.chead = (OLink *)malloc((M.ColSum+1)*sizeof(OLink));//將所有結(jié)點賦為空值for(int i = 1; i<=M.rowSum; i++){M.rhead[i]=NULL;}for(int i = 1; i <= M.ColSum; i++){M.chead[i]=NULL;} }/* ************************************************************************** *//* 6. 創(chuàng)建稀疏矩陣 */ void CreateMatrix(CrossList &M){int rowSum,ColSum,NumSum;int row, col, elem;cout << "請輸入創(chuàng)建的稀疏矩陣的行數(shù)、列數(shù)、非0元素個數(shù):\n" << endl;cin >> rowSum >> ColSum >> NumSum;M.rowSum = rowSum;M.ColSum = ColSum;M.NumSum = NumSum;//初始化矩陣InitSMatrix(M);//對矩陣進行賦值cout << "請按任意次序輸入" << M.NumSum <<"個非零元的行 列 元素值:" << endl;for(int i = 1; i <= NumSum; i++){cin >> row; cin >> col;cin >> elem;OLink newNode = (OLink)malloc(sizeof(OLNode));newNode -> row = row;newNode -> col = col;newNode -> elem = elem;InsertElem(newNode,M);}cout << "創(chuàng)建成功!創(chuàng)建的矩陣為:\n" << endl; // printf("創(chuàng)建成功!創(chuàng)建的矩陣為:\n");PrintSMatrix(M); }/* ************************************************************************** *//* 7. 插入結(jié)點值 */void InsertElem(OLink &newnode, CrossList &M){//將非零元素結(jié)點插入矩陣中OLink rowNode = M.rhead[newnode->row];//行的插入if (rowNode == NULL || rowNode -> col > newnode -> col) // 插在該行的第一個結(jié)點處 {newnode->right = rowNode;M.rhead[newnode->row] = newnode;}else {//尋找插的位置的前一個結(jié)點for (; !(rowNode->col < newnode->col && (rowNode->right == NULL||rowNode -> right -> col > newnode->col)); rowNode = rowNode->right);newnode->right = rowNode->right; //完成行插入 rowNode->right = newnode;}//列的插入OLink colNode = M.chead[newnode -> col];if (colNode == NULL || colNode -> row > newnode -> row) // 插在該行的第一個結(jié)點處 {newnode->down = colNode;M.chead[newnode->col] = newnode;}else {//尋找插的位置的前一個結(jié)點for (; !(colNode -> row < newnode->row && (colNode -> down == NULL || colNode -> down -> row > newnode->row)); colNode = colNode->down);newnode->down = colNode->down; //完成列插入 colNode->down = newnode;} }/* ************************************************************************** *//* 8. 輸出矩陣 */void PrintSMatrix(CrossList M){//初始條件: 稀疏矩陣M存在int i, j;for (i = 1; i <= M.rowSum; i++){ // 從第1行到最后1行OLink p = M.rhead[i]; // p指向該行的第1個非零元素for (j = 1; j <= M.ColSum; j++) // 從第1列到最后1列if (!p || p->col != j) // 已到該行表尾或當(dāng)前結(jié)點的列值不等于當(dāng)前列值printf("%-5d", 0); // 輸出0else{printf("%-5d", p->elem);p = p->right;}printf("\n");} }/* ************************************************************************** *//* 9. 修改矩陣中某個元素的值(如果沒有就增加) */void changeValue(CrossList &M){//如果不存在對應(yīng)下標(biāo)的值,則直接插入新的值int row;int col;int elem;cout << "請輸入需要修改的矩陣的行 列 元素值:\n" << endl;cin >> row >> col >> elem;OLink rowNode = M.rhead[row];OLink newnode = (OLink)malloc(sizeof(OLNode));newnode->row = row;newnode->col = col;newnode->elem = elem;if(rowNode == NULL || rowNode -> col > col){//如果行鏈表的頭結(jié)點為空或者是當(dāng)前修改的結(jié)點的列值大于頭結(jié)點的列值,直接插入cout << "插入新值!\n" << endl; // printf("插入新值!\n");InsertElem(newnode,M);}else{OLink nextNode = rowNode;//頭結(jié)點不為空,進行判斷while(nextNode){if(nextNode -> col == col){nextNode -> elem = elem;cout << "修改成功!\n" << endl; // printf("修改成功!\n");break;}else if(nextNode -> col > col){cout << "插入新值!\n" << endl; // printf("插入新值!\n");InsertElem(newnode,M);break;}else{nextNode = nextNode -> right;}}//頭結(jié)點為空時,直接插入if(nextNode == NULL){cout << "插入新值!\n" << endl; // printf("插入新值!\n");InsertElem(newnode,M);}}cout << "修改后的矩陣為:\n" << endl; // printf("修改后的矩陣為:\n");PrintSMatrix(M); }/* ************************************************************************** *//* 10. 查找矩陣中某個元素的值 */void findValue(CrossList &M){int row;int col;cout << "請輸入需要查找的矩陣的對應(yīng)的行 列 下標(biāo)值(如:10 10):\n" << endl;cin >> row >> col;OLink rowNode = M.rhead[row];if(rowNode == NULL || rowNode -> col > col){//如果行鏈表的頭結(jié)點為空或者是當(dāng)前修改的結(jié)點的列值大于頭結(jié)點的列值,該元素的值為0cout << "下標(biāo)為:(" << row << "," << col << ")值elem = 0\n" << endl;}else{OLink nextNode = rowNode;//頭結(jié)點不為空,進行判斷while(nextNode){if(nextNode -> col == col){int val = nextNode -> elem;cout << "下標(biāo)為:(" << row << "," << col << ")值elem =" << val << endl;break;}else if(nextNode -> col > col){cout << "下標(biāo)為:(" << row << "," << col << ")值elem = 0\n" << endl;break;}else{nextNode = nextNode -> right;}}//頭結(jié)點為空時,值為0 if(nextNode == NULL){cout << "下標(biāo)為:(" << row << "," << col << ")值elem = 0\n" << endl;}}}/* ************************************************************************** *//* 11. 刪除矩陣中某個元素的值 */void deleteValue(CrossList &M){int row;int col;cout << "請輸入1需要刪除的矩陣的對應(yīng)的行 列 的下標(biāo)值(如:10 10):\n" << endl;scanf("%d %d", &row, &col);//行指針的刪除OLink rowNode = M.rhead[row];if(rowNode == NULL || rowNode -> col > col){//如果行鏈表的頭結(jié)點為空或者是當(dāng)前的結(jié)點的列值大于頭結(jié)點的列值,該元素的值為0cout << "該下標(biāo)對應(yīng)的值為0,無需刪除\n" << endl;return;}else{OLink p = NULL, q = NULL;p = rowNode;while(rowNode){if(rowNode -> col == col){if(p == rowNode){M.rhead[row] = p -> right;}else{q ->right = p -> right;}break;}else if(rowNode -> col > col){return;}else{q = p;p = p -> right;}}}//列指針的刪除OLink ColNode = M.chead[col];if(ColNode == NULL || ColNode -> row > row){cout << "該下標(biāo)對應(yīng)的值為0,無需刪除\n" << endl;return;}else{OLink p = NULL, q = NULL;p = ColNode;while(ColNode){if(ColNode -> col == col){if(p == ColNode){M.chead[col] = p -> down;}else{q -> down = p -> down;}break;}else if(ColNode -> row > row){return;}else{q = p;p = p -> down;}}}cout << "刪除成功!\n" << endl;cout << "刪除后的矩陣為:\n" << endl;PrintSMatrix(M); }/* ************************************************************************* *//* 12. 兩個矩陣相加 */void AddMatrix(CrossList &M,CrossList &N, CrossList &out){//判斷矩陣是否滿足相加條件if(M.ColSum != N.ColSum || M.rowSum != N.rowSum){cout << "兩個矩陣不是同類型的,不能相加\n" << endl;return;}//對out矩陣進行初始化out.ColSum = M.ColSum;out.rowSum = M.rowSum;out.NumSum = 0;InitSMatrix(out);//進行相加for(int row = 1; row <= M.rowSum; row++){OLink Node1 = M.rhead[row];OLink Node2 = N.rhead[row];for(int col = 1; col <= M.ColSum; col++){//M,N在相同位置都有值if(Node1 && Node1 -> col == col && Node2 && Node2 -> col == col){ // //中間變量保存 // OLink Node3 = Node1; // OLink temp = Node1 -> right; // int tmp = Node1 -> elem; // // //插入 // Node3 -> elem = Node1-> elem + Node2 -> elem; // InsertElem(Node3, out); // out.NumSum++; // // //移動指針 // Node1->elem = tmp; // Node1 = temp; // Node2 = Node2 -> right;//賦值OLink Node3 = (OLink)malloc(sizeof(OLNode));Node3 -> elem = Node1-> elem + Node2 -> elem;Node3 -> row = Node1 -> row;Node3 -> col = Node1 -> col;cout << Node1 -> elem;cout << Node2 -> elem;cout << Node3 -> elem << Node3 -> row << Node3 -> col << endl;//插入 InsertElem(Node3, out);out.NumSum++;//移動指針 Node1 = Node1 -> right;Node2 = Node2 -> right;}//M位置沒有值,N位置有值if((Node1==NULL||Node1->col!=col)&& Node2 && Node2->col == col){ // //中間變量保存 // OLink Node3 = Node2; // OLink temp = Node2 -> right; // // //插入 // InsertElem(Node3, out); // out.NumSum++; // // //移動指針 // Node2 = temp;//賦值 OLink Node3 = (OLink)malloc(sizeof(OLNode));Node3 -> elem = Node2 -> elem;Node3 -> row = Node2 -> row;Node3 -> col = Node2 -> col;//插入 InsertElem(Node3,out);out.NumSum++;//移動指針 Node2 = Node2->right;}//M位置有值,N位置沒有值if(Node1 && Node1->col == col && (Node2 == NULL||Node2 ->col != col)){ // //中間變量保存 // OLink Node3 = Node1; // OLink temp = Node1 -> right; // // //插入 // InsertElem(Node3, out); // out.NumSum++; // // //移動指針 // Node1 = temp;//賦值 OLink Node3 = (OLink)malloc(sizeof(OLNode));Node3 -> elem = Node1 -> elem;Node3 -> row = Node1 -> row;Node3 -> col = Node1 -> col;//插入 InsertElem(Node3,out);out.NumSum++;//移動指針 Node1 = Node1->right;}}}cout << "相加后的矩陣為:\n" << endl;PrintSMatrix(out); }/* ************************************************************************* *//* 13. 兩個矩陣相減 */void SubtractMatrix(CrossList&M,CrossList &N, CrossList &out){//判斷矩陣是否滿足相減 條件if(M.ColSum != N.ColSum || M.rowSum != N.rowSum){cout << "兩個矩陣不是同類型的,不能相減 \n" << endl;return;}//對out矩陣進行初始化out.ColSum = M.ColSum;out.rowSum = M.rowSum;out.NumSum = 0;InitSMatrix(out);//進行相減 for(int row = 1; row <= M.rowSum; row++){OLink Node1 = M.rhead[row];OLink Node2 = N.rhead[row];for(int col = 1; col <= M.ColSum; col++){//M,N在相同位置都有值if(Node1 && Node1 -> col == col && Node2 && Node2 -> col == col){ // //中間變量保存 // OLink Node3 = Node1; // OLink temp = Node1 -> right; // // //插入 // Node3 -> elem = Node1-> elem - Node2 -> elem; // InsertElem(Node3, out); // out.NumSum++; // // //移動指針 // Node1 = temp; // Node2 = Node2 -> right;//賦值OLink Node3 = (OLink)malloc(sizeof(OLNode));Node3 -> elem = Node1-> elem - Node2 -> elem;Node3 -> row = Node1 -> row;Node3 -> col = Node1 -> col;//插入 InsertElem(Node3, out);out.NumSum++;//移動指針 Node1=Node1->right;Node2 = Node2 -> right;}//M位置沒有值,N位置有值if((Node1 == NULL || Node1 -> col != col) && Node2 && Node2 -> col == col){ // //中間變量保存 // OLink Node3 = Node2; // OLink temp = Node2 -> right; // // //插入 // Node3 -> elem = - Node2-> elem; // InsertElem(Node3, out); // out.NumSum++; // // //移動指針 // Node2 = temp;//賦值 OLink Node3 = (OLink)malloc(sizeof(OLNode));Node3 -> elem = - Node2 -> elem;Node3 -> row = Node2 -> row;Node3 -> col = Node2 -> col;//插入 InsertElem(Node3,out);out.NumSum++;//移動指針 Node2 = Node2->right;}//M位置有值,N位置沒有值if(Node1 && Node1 -> col == col && (Node2 == NULL || Node2 -> col != col)){ // //中間變量保存 // OLink Node3 = Node1; // OLink temp = Node1 -> right; // // //插入 // InsertElem(Node3, out); // out.NumSum++; // // //移動指針 // Node1 = temp;//賦值 OLink Node3 = (OLink)malloc(sizeof(OLNode));Node3 -> elem = Node1 -> elem;Node3 -> row = Node1 -> row;Node3 -> col = Node1 -> col;//插入 InsertElem(Node3,out);out.NumSum++;//移動指針 Node1 = Node1->right;}}}cout << "相減后的矩陣為:\n" << endl;PrintSMatrix(out); }/* ************************************************************************* *//* 14. 兩個矩陣相乘 */void MultiplyMatrix(CrossList &M,CrossList &N, CrossList &out){//判斷矩陣是否滿足相乘條件if(M.ColSum != N.rowSum){cout << "兩個矩陣不滿足相乘條件 \n" << endl;return;}//對out矩陣進行初始化out.rowSum = M.rowSum;out.ColSum = N.ColSum;out.NumSum = 0;InitSMatrix(out);//進行相乘//行列遍歷for(int row = 1; row <= out.rowSum; row++){for(int col = 1; col <= out.ColSum; col++){int elem = 0;OLink Node1 = M.rhead[row];OLink Node2 = N.chead[col];//對M的行,N的列進行遍歷for(; Node1; Node1 = Node1 -> right){for(; Node2 && Node2 -> row <= Node1 -> col; Node2 = Node2 -> down){ if(Node2 -> row == Node1 -> col){//執(zhí)行相乘elem = elem + Node1-> elem * Node2 -> elem;break;}}}//滿足條件插入矩陣if(elem){out.NumSum++;OLink newnode = (OLink)malloc(sizeof(OLNode));newnode -> row = row;newnode -> col = col;newnode -> elem = elem;InsertElem(newnode, out);}}}cout << "相乘后的矩陣為:\n" << endl;PrintSMatrix(out); }/* ************************************************************************* *//* 15. 矩陣轉(zhuǎn)置 */void TransposeSMatrix(CrossList &M, CrossList &out){//out對M進行復(fù)制一份CopySMatrix(M, out);//進行轉(zhuǎn)置for(int row = 1; row <= out.rowSum; row++){OLink rowNode = out.rhead[row];while(rowNode){//當(dāng)結(jié)點不為空時,進行指針和下標(biāo)的交換OLink nextRightNode = rowNode -> right;//下標(biāo)更換int row = rowNode -> row;rowNode -> row = rowNode -> col;rowNode -> col = row;//指針交換OLink down = rowNode -> down;rowNode -> down = rowNode -> right;rowNode -> right = down;//對下一個進行判斷rowNode = nextRightNode;}}//進行轉(zhuǎn)置后的交換int rowSum = out.rowSum;int ColSum = out.ColSum;OLink* rhead = out.rhead;out.ColSum = rowSum;out.rowSum = ColSum;out.rhead = out.chead;out.chead = rhead;cout << "轉(zhuǎn)置后的矩陣為:\n" << endl;PrintSMatrix(out);}/* ************************************************************************* *//* 16. 矩陣求最值 */void findMaxOrMin(CrossList &M){int min = INT_MAX;int max = INT_MIN;//矩陣最大值for(int i = 1; i <= M.rowSum; i++){OLink p = M.rhead[i];while(p != NULL){if(max < p -> elem)max = p -> elem;p = p -> right;}}//矩陣最小值for(int i = 1; i <= M.rowSum; i++){OLink p = M.rhead[i];while(p != NULL){if(min > p -> elem)min = p -> elem;p = p -> right;}}cout << "矩陣的最大值為: \n" << max << endl;cout << "矩陣的最小值為: \n" << min << endl; }/* ************************************************************************* *//* 17. 復(fù)制矩陣 */void CopySMatrix(CrossList &M, CrossList &out){//對out進行初始化out.NumSum = M.NumSum;out.ColSum = M.ColSum;out.rowSum = M.rowSum;InitSMatrix(out);//復(fù)制for (int row = 1; row <= M.rowSum; row++) {OLink rowNode = M.rhead[row];while(rowNode){OLink newnode = (OLink)malloc(sizeof(OLNode));newnode -> row = rowNode -> row;newnode -> col = rowNode -> col;newnode -> elem = rowNode -> elem;InsertElem(newnode, out);rowNode = rowNode -> right;}}// printf("復(fù)制得到的矩陣為:\n");// PrintSMatrix(out); }/* ************************************************************************* *//* 18. 從文件中讀取 */void ReadFromFile(CrossList &M){FILE* fpread;char str[100];int count=0;int num[1000];cout << "請輸入文件名稱:\n" << endl;cin >> str;fpread = fopen(str, "r");if (fpread == NULL){cout << "不存在該文件!\n" << endl;return ;}//讀取數(shù)據(jù)while(1) { int ch = fgetc(fpread);if(ch == EOF)break;elsefscanf(fpread, "%d", &num[count++]);}fclose(fpread);//初始化矩陣并輸出M.rowSum = num[0];M.ColSum = num[1];M.NumSum = num[2];InitSMatrix(M);cout << num[0] << M.ColSum << M.NumSum << endl;for(int i = 3; i < count; i+=3){OLink newNode = (OLink)malloc(sizeof(OLNode));newNode -> row = num[i];newNode -> col = num[i+1];newNode -> elem = num[i+2];InsertElem(newNode,M);}//顯示矩陣cout << "文件中讀取的矩陣為:\n" << endl;PrintSMatrix(M); }/* ************************************************************************* *//* 19. 把矩陣寫入文件 */void WriteToFile(CrossList &M){char str[1024];cout << "請輸入需要保存到的文件名:\n" << endl;cin >> str;FILE* fid = fopen(str, "wt");if (fid == NULL){cout << "文件不存在!\n" << endl;return;}//寫入文件fprintf(fid," ");fprintf(fid,"%d ",M.rowSum);fprintf(fid,"%d ",M.ColSum);fprintf(fid,"%d\n",M.NumSum);for(int i = 1; i <= M.rowSum; i++){OLink Node = M.rhead[i];while(Node != NULL){fprintf(fid,"%d ",Node -> row);fprintf(fid,"%d ",Node -> col);fprintf(fid,"%d\n",Node -> elem);Node = Node -> right;}}fclose(fid);cout << "文件寫入成功!\n" << endl; }/* ************************************************************************* *//* 20. 哈希查找函數(shù)(用于手動寫入矩陣) */CrossList HashFind(char name[10]){struct HashCross *tmp = NULL;HASH_FIND_STR(cross,name,tmp);if(tmp == NULL){cout << "該矩陣不存在,系統(tǒng)已經(jīng)自動為您生成該名稱的矩陣\n" << endl;CrossList M;tmp = (struct HashCross *)malloc(sizeof(struct HashCross));strcpy(tmp -> name, name);CreateMatrix(M);tmp -> crosslist = M;HASH_ADD_STR(cross,name,tmp);if(cross == NULL) cout << "hash還是空" << endl; return M;}else{cout << "該矩陣存在!\n" << endl;return tmp -> crosslist;} }/* ************************************************************************* *//* 21. 哈希查找函數(shù)(用于讀文件寫入矩陣) */CrossList HashFind2(char name[10]){struct HashCross *tmp = NULL;HASH_FIND_STR(cross,name,tmp);if(tmp == NULL){cout << "該矩陣不存在,系統(tǒng)已經(jīng)自動為您生成該名稱的矩陣\n" << endl;tmp = (struct HashCross *)malloc(sizeof(struct HashCross));strcpy(tmp -> name, name);CrossList M;ReadFromFile(M);tmp -> crosslist = M;HASH_ADD_STR(cross,name,tmp);return M;}else{cout << "該矩陣存在!\n" << endl;return tmp -> crosslist;} }/* ************************************************************************* *//* 21. 獲取矩陣名(沒有的話,自動創(chuàng)建矩陣) */CrossList getCrossList(){CrossList M;cout << "請輸入需要操作的矩陣名稱:(長度小于10)\n" << endl;char name[10];cin >> name;M = HashFind(name);return M; }/* ************************************************************************* *//* 22.主函數(shù)調(diào)用 */int main(){menu();return 0; }/* ************************************************************************** */總結(jié)
以上是生活随笔為你收集整理的十字链表实现稀疏矩阵,包含十二大功能的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python列表相关函数_python中
- 下一篇: NDK环境配置