首页 > 其他分享 >三元组存以及十字链表的创建

三元组存以及十字链表的创建

时间:2023-11-06 21:56:31浏览次数:43  
标签:head int 三元组 链表 十字 OLNode row col MariA

  1 #define _CRT_SECURE_NO_WARNINGS
  2 #include <iostream>
  3 #include<fstream>
  4 #define _CRT_SECURE_NO_WARNINGS
  5 using namespace std;
  6 
  7 struct TripleArray
  8 {
  9     int row;//行
 10     int col;//列
 11     int val;//值
 12 };
 13 //三元表
 14 
 15 int row = 1;//记录元数组行数
 16 int col = 0;//记录元数组列数
 17 int arr[11][11];//元数组
 18 int MartNumb = 1;//记录三元组个数=非零元个数
 19 TripleArray MariA[200];//三元组
 20 TripleArray MariB[200];//三元组
 21 
 22 /*十字链表的结构类型定义如下:*/
 23 typedef struct OLNode
 24 {
 25     int row;
 26     int col; 
 27     int value;
 28     OLNode* right; 
 29     OLNode* down;
 30 };
 31 
 32 typedef struct
 33 {
 34     OLNode** row_head;
 35     OLNode** col_head;
 36     int totalrow;
 37     int totalcol;
 38     int NotZeroNumbs;
 39 } CrossList;
 40 
 41 void CreateCrossList(CrossList* M)
 42 {
 43     OLNode* p;
 44     OLNode* q;
 45 
 46     M->totalrow = row;
 47     M->totalcol =col;
 48     M->NotZeroNumbs = MartNumb;
 49 
 50     //开辟空间
 51     if (!(M->row_head = (OLNode**)malloc(row * sizeof(OLNode*))))
 52         exit(OVERFLOW);
 53     if (!(M->col_head = (OLNode**)malloc(col * sizeof(OLNode*))))
 54         exit(OVERFLOW);
 55     /*初始化行、列,头指针指向量,各行、列链表为空的链表*/
 56     for (int h = 1; h <=row; h++)
 57     {
 58         M->row_head[h] = NULL;
 59     }
 60     for (int t = 1; t <=col; t++)
 61     {
 62         M->col_head[t] = NULL;
 63     }
 64 
 65     for (int i=1;i<=row;i++)
 66         for (int j = 1; j <= col; j++)
 67         {
 68             if (arr[i][j] != 0)
 69             {
 70                 if (!(p = (OLNode*)malloc(sizeof(OLNode))))
 71                     exit(OVERFLOW);
 72 
 73                 p->row = i;
 74                 p->col = j;
 75                 p->value = arr[i][j];
 76 
 77                 if (M->row_head[i] == NULL)
 78                 {
 79                     M->row_head[i] = p;
 80                     p->right = NULL;
 81                 }
 82                 else
 83                 {
 84                     /*寻找行表中的插入位置*/
 85                     for (q = M->row_head[i]; q->right && q->right->col < j; q = q->right);
 86                     p->right = q->right;
 87                     q->right = p; /*完成插入*/
 88                 }
 89                 if (M->col_head[j] == NULL)
 90                 {
 91                     M->col_head[j] = p;
 92                     p->down = NULL;
 93                 }
 94                 else
 95                 {
 96                     //寻找列表中的插入位置
 97                     for (q = M->col_head[j]; q->down && q->down->row < i; q = q->down);
 98                     p->down = q->down;
 99                     q->down = p;
100                 }
101             }
102         }
103 }
104 
105 //创建三元组
106 void CreateTripleArray()
107 {
108     for (int i = 1; i <= row; i++)
109     {
110         for (int j = 1; j <= col; j++)
111         {
112             if (arr[i][j] != 0)//如果非零就存进去
113             {
114                 MariA[MartNumb].col = j;
115                 MariA[MartNumb].row = i;
116                 MariA[MartNumb].val = arr[i][j];
117                 MartNumb++;
118             }
119         }
120     }
121 }
122 
123 void SortMartic()
124 {
125     //冒泡排序
126     for (int i = 1; i < MartNumb-1; i++)
127     {
128         for (int j = i + 1; j < MartNumb; j++)
129         {
130             if (MariA[i].row > MariA[j].row)
131             {
132                 int temp;
133                 temp = MariA[i].row;
134                 MariA[i].row = MariA[j].row;
135                 MariA[j].row = temp;
136 
137                 int temp2;
138                 temp2 = MariA[i].col;
139                 MariA[i].col = MariA[j].col;
140                 MariA[j].col = temp2;
141 
142                 int temp3 = MariA[i].val;
143                 MariA[i].val = MariA[j].val;
144                 MariA[j].val = temp3;
145             }
146             //假如行数相同比较列数
147             else if (MariA[i].row == MariA[j].row && MariA[i].col > MariA[j].col)
148             {
149                 int temp2;
150                 temp2 = MariA[i].col;
151                 MariA[i].col = MariA[j].col;
152                 MariA[j].col = temp2;
153 
154                 int temp3 = MariA[i].val;
155                 MariA[i].val = MariA[j].val;
156                 MariA[j].val = temp3;
157             }
158         }
159     }
160 }
161 
162 void OverTurnMart()
163 {
164     int q = 1;
165     for (int k = 1; k <= col; k++)
166     {
167         for (int p = 1; p < MartNumb; p++)
168         {
169             if (MariA[p].col == k)
170             {
171                 MariB[q].row = MariA[p].col;
172                 MariB[q].col = MariA[p].row;
173                 MariB[q].val = MariA[p].val;
174                 q++;
175             }
176         }
177     }
178 }
179 
180 int main()
181 {
182     //文件读取矩阵操作
183     FILE* fp = fopen("datamatrix.txt", "r");
184     if (fp == NULL)
185         return 0;
186     int a = fgetc(fp);
187     while (a != EOF)
188     {
189         //数字操作(可能两位数)
190         if (a - '0' >= 0 && a - '0' <= 9)
191         {
192             int sum = a - '0';
193             a = fgetc(fp);
194             while (a - '0' >= 0 && a - '0' <= 9)
195             {
196                 sum = sum * 10 + a - '0';
197                 a = fgetc(fp);
198             }
199             col++;
200             arr[row][col] = sum;
201         }
202         if (a == '\n')
203         {
204             row++;
205             col = 0;
206         }
207         a = fgetc(fp);
208     }
209 
210     cout << "row:" << row << endl;
211     cout << "col:" << col << endl;
212 
213     cout << "数组是:" << endl;
214     for (int i = 1; i <= row; i++)
215     {
216         for (int j = 1; j <= col; j++)
217             cout << arr[i][j] << " ";
218         cout << endl;
219     }
220 
221     //创建三元组
222     CreateTripleArray();
223 
224     fstream Output1;
225     Output1.open("matrix.txt", ios::out);
226     cout << "三元组是:" << endl;
227     for (int i = 1; i < MartNumb; i++)
228     {
229         cout << MariA[i].row << " " << MariA[i].col << " " << MariA[i].val << endl;
230         Output1<< MariA[i].row << " " << MariA[i].col << " " << MariA[i].val << endl;
231     }
232     Output1.close();
233 
234     cout << "选择转置方式(1或2)" << endl;
235     int choice;
236     cin >> choice;
237    
238     if (choice == 1)
239     {
240         cout << "矩阵转置1" << endl;
241         fstream Output2;
242         Output2.open("matrix-a.txt", ios::out);
243         for (int i = 1; i < MartNumb; i++)
244         {
245             int t = MariA[i].col;
246             MariA[i].col = MariA[i].row;
247             MariA[i].row = t;
248         }
249         cout << "排序" << endl;
250         SortMartic();
251         for (int i = 1; i < MartNumb; i++)
252         {
253             cout << MariA[i].row << " " << MariA[i].col << " " << MariA[i].val << endl;
254             Output2 << MariA[i].row << " " << MariA[i].col << " " << MariA[i].val << endl;
255         }
256         Output2.close();
257     }
258     else if (choice == 2)
259     {
260         cout << "矩阵转置2" << endl;
261         fstream Output3;
262         Output3.open("matrix-b.txt", ios::out);
263         OverTurnMart();
264         for (int i = 1; i < MartNumb; i++)
265         {
266             cout << MariB[i].row << " " << MariB[i].col << " " << MariB[i].val << endl;
267             Output3 << MariB[i].row << " " << MariB[i].col << " " << MariB[i].val << endl;
268         }
269         Output3.close();
270     }
271 
272     //创建十字链表
273     CrossList M;
274     CreateCrossList(&M);
275 
276     fstream Output4;
277     Output4.open("matrix-c.txt", ios::out);
278     cout << "遍历所有行非零元素" << endl;
279     for (int i = 1; i <= row; i++)
280     {
281         OLNode* pCur = M.row_head[i];
282         while (pCur != NULL)
283         {
284             cout << pCur->row << " " << pCur->col << " " << pCur->value << endl;
285             Output4<< pCur->row << " " << pCur->col << " " << pCur->value << endl;
286             pCur = pCur->right;
287         }
288     }
289     Output4.close();
290 
291     return 0;
292 }

 

标签:head,int,三元组,链表,十字,OLNode,row,col,MariA
From: https://www.cnblogs.com/saucerdish/p/17813846.html

相关文章

  • 大二算法实验一用循环链表解决约瑟夫环
    题目约瑟夫(Joeph)问题的一种描述是:编号为1,2,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的......
  • 基础排序——数组和链表实现(C)
    一、数组实现①选择排序从index=0开始,每一轮找到一个最小的元素,然后交换num[index]和num[min]的位置,直至数组遍历完。得到一个升序数组。voidselectSort(int*num,intn){for(inti=0;i<n;i++){intmin=i;for(intj=i+1;j<n;j++){......
  • 链表发布会
    链表可是个好东西,那么我今天便拿出——自制链表!!!它有着精美丑陋的外观classlist简洁的语言public: protected: intlen; structnode{ Tv; node*pre,*nxt; }*head,*tail;比stl更丰富6!voidinsert(intx,constT&v){ len++; node*......
  • 数据结构之树(二叉树的存储方式之链表)
    JavaJava中可以使用链表来实现二叉树的存储。1.链表实现二叉树的原理:   链表是由节点组成的数据结构,每个节点包含一个数据和指向下一个节点的指针。  在链表中,可以将二叉树的每个节点都看作一个链表节点,同时维护一个指向左子节点的指针和一个指向右子节点的指针。通过......
  • 数据结构记录-链表
    1、单链表1、单链表的组成最基本的单链表组成如下:typedefstructLink{charelem;/*数据域*/structLink*next;/*指针域*/}link;/*节点名,每个阶段都是一个Link结构体*/为什么这样的就是链表呢,需要从这个结构体内部组成来看,structLinknext;定义了一个指针变......
  • 07_环形链表
    环形链表给定一个链表的头节点head,返回链表开始入环的第一个节点。如果链表无环,则返回null。如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数pos来表示链表尾连接到链表中的位置(索引从0开始)。如......
  • 顺序表和链表
    writeup后面写258.链表去重给定一个键值为整数的单链表L,将键值的绝对值有重复的结点删除:即对任意键值K,只有键值或其绝对值等于K的第一个结点被保留在L中。例如,下面单链表L包含键值21、-15、15、7、-15,如下图(a)所示;去重后的链表L包含键值21、-15、7,如......
  • 数据结构之链表
    1.简介链表(LinkedList)是一种基本的数据结构,用于表示一组元素,这些元素按顺序排列,每个元素都与下一个元素连接。与数组不同,链表的元素不是在内存中连续存储的,而是通过指针来连接的。链表由节点(Node)组成,每个节点包含两个主要部分:数据和指向下一个节点(或上一个节点,如果是双向链表)的......
  • Java面试题:链表-合并两个排序的链表
    描述输入两个递增的链表,单个链表的长度为n,合并这两个链表并使新链表中的节点仍然是递增排序的。示例输入:{1,3,5},{2,4,6}返回值:{1,2,3,4,5,6}原题地址:https://www.nowcoder.com/practice/d8b6b4358f774294a89de2a6ac4d9337代码实现packagecom.example.demo.linked;......
  • Java面试题:链表-反转链表
    问题描述给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。如当输入链表{1,2,3}时,经反转后,原链表变为{3,2,1},所以对应的输出为{3,2,1}。示例输入:{1,2,3}返回值:{3,2,1}原题地址:https://www.nowcoder.com/practice/7......