//创建十字链表的数据是从文件中读取的故加上了文件读写
#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);
}