logo资料库

基于十字链表存储的稀疏矩阵的转置.docx

第1页 / 共6页
第2页 / 共6页
第3页 / 共6页
第4页 / 共6页
第5页 / 共6页
第6页 / 共6页
资料共6页,全文预览结束
//创建十字链表的数据是从文件中读取的故加上了文件读写 #include #include #include using namespace std; typedef int ElemTP; typedef struct node { int i, j; ElemTP e; struct node *right, *down; }OLNode; void ReadFromFile(OLNode &s, int &num);//从文件中读取三元组并建立三元表 int InitOLNode(OLNode &s, int m, int n);//初始化十字链表 int InsertInOLNode(OLNode &s, int i, int j, ElemTP e);//往十字链表中添加元素 void PrintOLLode(OLNode &s);//输出十字链表 void swap(int &i, int &j);//交换两个数据的值 void Transposition(OLNode &s);//十字链表的转置 void WriteInFile(OLNode &s, int num);//将十字链表写入另一个文件 int main() { OLNode s; int num; ReadFromFile(s, num); cout << "十字链表输出为:" << endl; PrintOLLode(s); Transposition(s); cout << "十字链表转置输出为:" << endl; PrintOLLode(s); WriteInFile(s, num); system("pause"); return 0; }
void ReadFromFile(OLNode &s, int &num)//从文件中读取数据 { FILE *fp; int m, n, t; int i, j, e; if ((fp = fopen("C:\\DataStructure\\data.txt", "r")) == NULL) { cout << "can not open the file" << endl; exit(0); } else { cout << "Read Successfully" << endl; } fscanf(fp, "%d %d %d\n", &m, &n, &t); num = t; InitOLNode(s, m, n); for (int k = 0; k < t; k++) { fscanf(fp, "%d %d %d\n", &i, &j, &e); InsertInOLNode(s, i, j, e); } fclose(fp); } int InitOLNode(OLNode &s, int m, int n)//初始化十字链表 { s.i = m; s.j = n; //创建列头结点 s.right = new OLNode[n]; if (!s.right) return 0; for (int j = 0; j < n; j++) {
s.right[j].j = j; s.right[j].down = &s.right[j]; } s.down = new OLNode[m]; //创建行头结点 if (!s.down) return 0; for (int i = 0; i < m; i++) { s.down[i].i = i; s.down[i].right = &s.down[i]; } return 1; } int InsertInOLNode(OLNode &s, int i, int j, ElemTP e)//往十字链表中插入结点 { if (i < 0 || j < 0 || i >= s.i || j >= s.j) return 0; OLNode *n = new OLNode; if (!n) return 0; n->i = i; n->j = j; n->e = e; OLNode *pr, *p; //将新结点插入到第i行 pr = &s.down[i]; p = pr->right; while (p != &s.down[i] && j > p->j) { pr = p; p = p->right; } pr->right = n; n->right = p;
//将新结点插入到第j列 pr = &s.right[j]; p = pr->down; while (p != &s.right[j] && i > p->i) { pr = p; p = p->down; } pr->down = n; n->down = p; return 1; } void PrintOLLode(OLNode &s)//打印十字链表 { OLNode *p; for (int i = 0; i < s.i; i++) { p = s.down[i].right; while (p != &s.down[i]) { cout << "(" << p->i << "," << p->j << "," << p->e << ")" << endl; p = p->right; } } } void swap(int &i, int &j)//交换 { int temp; temp = i; i = j; j = temp; } void Transposition(OLNode &s)//十字链表的转置 { OLNode *p, *save, *temp;
//将原十字链表中的元素的行坐标和列坐标,行指针和列指针交换 for (int i = 0; i < s.i; i++) { p = s.down[i].right; while (p != &s.down[i]) { swap(p->i, p->j); save = p; p = p->right; temp = save->right; save->right = save->down; save->down = temp; } } //将列头结点的行,列坐标以及行指针和列指针交换 for (int i = 0; i < s.j; i++) { swap(s.right[i].i, s.right[i].j); temp = s.right[i].right; s.right[i].right = s.right[i].down; s.right[i].down = temp; } //将行头结点的行,列坐标以及行指针和列指针交换 for (int i = 0; i < s.i; i++) { swap(s.down[i].i, s.down[i].j); temp = s.down[i].right; s.down[i].right = s.down[i].down; s.down[i].down = temp; } //将总头结点的行指针和列指针以及 temp = s.right; s.right = s.down; s.down = temp; swap(s.i, s.j);
} void WriteInFile(OLNode &s, int num)//将十字矩阵写入文件 { FILE *fp; OLNode *p; if ((fp = fopen("C:\\DataStructure\\data1.txt", "w")) == NULL) { cout << "can not open the file" << endl; exit(0); } fprintf(fp, "%d %d %d\n", s.i, s.j, num); for (int row = 0; row < s.i; row++) { p = s.down[row].right; while (p != &s.down[row]) { fprintf(fp, "%d %d %d\n", p->i, p->j, p->e); p = p->right; } } cout << "Write Successfully" << endl; fclose(fp); }
分享到:
收藏