当前位置:   article > 正文

数据结构实验:基于十字链表的稀疏矩阵转置_* 十字链表的稀疏矩阵转置 */ void transmatrix(crosslist *a, cr

* 十字链表的稀疏矩阵转置 */ void transmatrix(crosslist *a, crosslist *b) { o

采用C++编程,基于十字链表完成转置。

思想为改变行列指针指向。 

  1. #include <iostream>
  2. #include <string>
  3. #include <fstream>
  4. using namespace std;
  5. #define ERROR -1
  6. #define OK 1
  7. typedef int ElemType;
  8. typedef int Status;
  9. typedef struct OLNode
  10. {
  11. int i, j;//矩阵非零元素的行、列值
  12. ElemType e;//非零元素的值
  13. OLNode* right, * down;//行列后继域
  14. }OLNode, * Olink;
  15. typedef struct
  16. {
  17. Olink rhead, chead;//行、列 表指针基址
  18. int mu, nu, tu;//矩阵的行、列、非零元素个数
  19. }CrossList;
  20. Status insert(Olink h, int i, int j, int e)//插入结点
  21. {
  22. int m = h->i, n = h->j;
  23. if (i < 0 || i >= m || j < 0 || j >= n) return ERROR;//结点坐标不合法则返回ERROR
  24. Olink p = new OLNode; if (!p) return ERROR;//建立新结点
  25. p->i = i;p->j = j;p->e = e;
  26. Olink qr = &h->down[i], q = qr->right;
  27. while (q != &h->down[i] && j > q->j)//找到结点插入位置
  28. {
  29. qr = q;q = q->right;
  30. }
  31. qr->right = p;p->right = q;
  32. qr = &h->right[j];q = qr->down;
  33. while (q != &h->right[j] && i > q->i)
  34. {
  35. qr = q;q = q->down;
  36. }
  37. qr->down = p;
  38. p->down = q;
  39. cout << i << '\t' << j << '\t' << e << endl;
  40. return OK;
  41. }
  42. Status init(Olink h)//从文件中获取数据初始化十字链表
  43. {
  44. fstream data;
  45. data.open("data.txt");
  46. data >> h->i >> h->j;//建立总头节点,头结点内存储行列数与行列基址
  47. int t;
  48. data >> t;
  49. h->e = t;
  50. h->down = new OLNode[h->i];//创建行头数组
  51. if (!h->down) return ERROR;//返回NULL表示创建失败
  52. h->right = new OLNode[h->j];//创建列头数组
  53. if (!h->right) return ERROR;
  54. for (int i = 0;i < h->i;i++)//初始化行列头结点
  55. {
  56. h->down[i].i = i;
  57. h->down[i].right = &h->down[i];
  58. }
  59. for (int j = 0;j < h->j;j++)
  60. {
  61. h->right[j].j = j;
  62. h->right[j].down = &h->right[j];
  63. }
  64. int m = h->i, n = h->j;
  65. for (;t > 0;t--)
  66. {
  67. int i, j, e;
  68. data >> i >> j >> e;
  69. insert(h, i, j, e);
  70. }
  71. data.close();
  72. return OK;
  73. }
  74. Status Transpose(Olink h)//矩阵转置
  75. {
  76. fstream data;
  77. data.open("out.txt");
  78. int mid=h->i;
  79. h->i = h->j;
  80. h->j = mid;
  81. Olink pn;
  82. data << h->i << '\t' << h->j << '\t' << h->e << endl;
  83. for (int i = 0;i<h->i;i++)//从列数组遍历,改变down指针与right指针的指向
  84. {
  85. Olink p = &h->right[i];
  86. p->right = p->down;
  87. p = h->right[i].down;
  88. while(p!=&h->right[i])
  89. {
  90. pn = p->down;
  91. p->down = p->right;
  92. p->right = pn;
  93. mid = p->i;
  94. p->i = p->j;
  95. p->j = mid;
  96. data<< p->i << '\t' << p->j << '\t' << p->e << endl;//写入文件
  97. p = pn;
  98. }
  99. }
  100. for (int i = 0;i < h->j;i++)//改变行头数组的指向
  101. {
  102. Olink p = &h->down[i];
  103. p->down = p -> right;
  104. }
  105. Olink q = h->right;
  106. h->right = h->down;
  107. h->down = q;
  108. for (int i = 0;i < h->i;i++)
  109. {
  110. Olink p = h->down[i].right;
  111. while (p != &h->down[i])
  112. {
  113. cout << p->i << '\t' << p->j << '\t' << p->e << endl;
  114. p = p->right;
  115. }
  116. }
  117. data.close();
  118. return OK;
  119. }
  120. int main()
  121. {
  122. OLNode h;
  123. init(&h);
  124. cout << endl;
  125. Transpose(&h);
  126. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/编程探险家2/article/detail/62866
推荐阅读
相关标签
  

闽ICP备14008679号