数据结构中的十字链表(1)
2008-04-12 13:30
253 查看
重新复习数据结构,十字链表主要在两个地方应用:稀疏矩阵的存储, 有向图的存储。
稀疏矩阵,常用三元组存储,但是当矩阵的非零元素和位置在操作过程中变化较大时,就不一采用顺序结构存储了,此时十字链表就是不错的选择。
下面是十字链表的数据结构,以及创建函数,篇幅有限没有帖内存释放的函数:
typedef struct QLNode
...{
int iPos, jPos; //非零元素的行列下标;
int iElem; //元素;
struct QLNode *right, *down;
}QLNode;
typedef struct QLNode* QLink;
typedef struct
...{
QLink *rHead, *cHead; //行列的头指针;
int RowNum, ColNum, TotalNum;
}CrossList;
bool CreatCrossList(CrossList& CroLit)
...{
int row, coll, total;
cin>>row>>coll>>total;
CroLit.RowNum=row; CroLit.ColNum=coll; CroLit.TotalNum=total;
CroLit.rHead= new QLink[row]; //创建行头指针表;
CroLit.cHead= new QLink[coll]; //创建列头指针表;
//初始化头指针表;
for (int i=0; i<row; i++)
CroLit.rHead[i]=NULL;
for (int i=0; i<coll; i++)
CroLit.cHead[i]=NULL;
int i, j, elem; //以三元组的形式输入
for(cin>>i>>j>>elem; elem!=0; cin>>i>>j>>elem)
...{
QLink pTem= new QLNode;
pTem->right=pTem->down=NULL;
pTem->iPos=i; pTem->jPos=j; pTem->iElem=elem;
//直接插入:空,或者列坐标大于此行链表中的最大列坐标
// 同一行里面,链表按照列的坐标排序,
if( CroLit.rHead[i]==NULL || CroLit.rHead[i]->jPos>j )
...{
pTem->right= CroLit.rHead[i];
CroLit.rHead[i]=pTem;
}
else //查寻在行表中的插入位置:
...{
QLink bg;
for(bg=CroLit.rHead[i]; bg->right && bg->right->jPos<j; bg=bg->right);
pTem->right=bg->right; bg->right=pTem;
} //完成行插入。
//直接插入:空,或者行坐标大于此列链表中的最大行坐标
// 同一列里面,链表按照行的坐标排序,
if( CroLit.cHead[j]==NULL || CroLit.cHead[j]->iPos>i )
...{
pTem->down= CroLit.cHead[j];
CroLit.cHead[j]=pTem;
}
else //查寻在列表中的插入位置:
...{
QLink bg;
for(bg=CroLit.cHead[j]; bg->down && bg->down->iPos<i; bg=bg->down);
pTem->down=bg->down; bg->down=pTem;
} //完成列插入。
}
return true;
}
//输出各行元素
void DisplayRow(CrossList dest)
...{
for (int i=0; i<dest.RowNum; i++)
...{
QLink tem=dest.rHead[i];
while (tem)
...{
cout<<"( "<<tem->iPos<<", ";
cout<<tem->jPos<<", ";
cout<<tem->iElem<<" )";
tem=tem->right;
}
cout<<endl;
}
}
举个例子,稀疏矩阵:
| 3 0 0 5 |
| 0 2 0 0 |
| 2 0 0 0 |
/*测试输入:
3 4 4
0 0 3
0 3 5
1 1 2
2 0 2
0 0 0 /表示结束*/
/*测试输出:
( 0, 0, 3 )( 0, 3, 5 )
( 1, 1, 2 )
( 2, 0, 2 )
请按任意键继续. . .*/
下面是该十字链表的存储图:
稀疏矩阵,常用三元组存储,但是当矩阵的非零元素和位置在操作过程中变化较大时,就不一采用顺序结构存储了,此时十字链表就是不错的选择。
下面是十字链表的数据结构,以及创建函数,篇幅有限没有帖内存释放的函数:
typedef struct QLNode
...{
int iPos, jPos; //非零元素的行列下标;
int iElem; //元素;
struct QLNode *right, *down;
}QLNode;
typedef struct QLNode* QLink;
typedef struct
...{
QLink *rHead, *cHead; //行列的头指针;
int RowNum, ColNum, TotalNum;
}CrossList;
bool CreatCrossList(CrossList& CroLit)
...{
int row, coll, total;
cin>>row>>coll>>total;
CroLit.RowNum=row; CroLit.ColNum=coll; CroLit.TotalNum=total;
CroLit.rHead= new QLink[row]; //创建行头指针表;
CroLit.cHead= new QLink[coll]; //创建列头指针表;
//初始化头指针表;
for (int i=0; i<row; i++)
CroLit.rHead[i]=NULL;
for (int i=0; i<coll; i++)
CroLit.cHead[i]=NULL;
int i, j, elem; //以三元组的形式输入
for(cin>>i>>j>>elem; elem!=0; cin>>i>>j>>elem)
...{
QLink pTem= new QLNode;
pTem->right=pTem->down=NULL;
pTem->iPos=i; pTem->jPos=j; pTem->iElem=elem;
//直接插入:空,或者列坐标大于此行链表中的最大列坐标
// 同一行里面,链表按照列的坐标排序,
if( CroLit.rHead[i]==NULL || CroLit.rHead[i]->jPos>j )
...{
pTem->right= CroLit.rHead[i];
CroLit.rHead[i]=pTem;
}
else //查寻在行表中的插入位置:
...{
QLink bg;
for(bg=CroLit.rHead[i]; bg->right && bg->right->jPos<j; bg=bg->right);
pTem->right=bg->right; bg->right=pTem;
} //完成行插入。
//直接插入:空,或者行坐标大于此列链表中的最大行坐标
// 同一列里面,链表按照行的坐标排序,
if( CroLit.cHead[j]==NULL || CroLit.cHead[j]->iPos>i )
...{
pTem->down= CroLit.cHead[j];
CroLit.cHead[j]=pTem;
}
else //查寻在列表中的插入位置:
...{
QLink bg;
for(bg=CroLit.cHead[j]; bg->down && bg->down->iPos<i; bg=bg->down);
pTem->down=bg->down; bg->down=pTem;
} //完成列插入。
}
return true;
}
//输出各行元素
void DisplayRow(CrossList dest)
...{
for (int i=0; i<dest.RowNum; i++)
...{
QLink tem=dest.rHead[i];
while (tem)
...{
cout<<"( "<<tem->iPos<<", ";
cout<<tem->jPos<<", ";
cout<<tem->iElem<<" )";
tem=tem->right;
}
cout<<endl;
}
}
举个例子,稀疏矩阵:
| 3 0 0 5 |
| 0 2 0 0 |
| 2 0 0 0 |
/*测试输入:
3 4 4
0 0 3
0 3 5
1 1 2
2 0 2
0 0 0 /表示结束*/
/*测试输出:
( 0, 0, 3 )( 0, 3, 5 )
( 1, 1, 2 )
( 2, 0, 2 )
请按任意键继续. . .*/
下面是该十字链表的存储图:
相关文章推荐
- 数据结构中的十字链表(2)
- 数据结构-图-十字链表的构造(1)
- 数据结构--十字链表(相加,创建)
- 数据结构--数组和广义表--创建以十字链表为存储结构的矩阵
- 数据结构:有向图的十字链表存储表示(c实现)
- 【算法与数据结构】图 -- 十字链表
- 数据结构学习笔记 --- 图(十字链表)
- 十字链表 稀疏矩阵的数据结构
- 5-4-十字链表(稀疏矩阵)-数组和广义表-第5章-《数据结构》课本源码-严蔚敏吴伟民版
- 数据结构例程——稀疏矩阵的十字链表表示
- 动手实现 数据结构 之 “十字链表”
- c语言版数据结构(奇迹冬瓜)-数组和广义表(十字链表存贮稀疏矩阵的行列值)
- 数据结构学习笔记 --- 图(十字链表)
- 【学习笔记----数据结构17-图的十字链表】
- 【数据结构】算法5.4 十字链表-创建
- c语言实现十字链表储存有向图(《数据结构》算法7.3)
- 数据结构之---C/C++实现稀疏矩阵的十字链表
- 数据结构9————马鞍点问题&三元组稀疏矩阵&十字链表稀疏链表的加减法
- 数据结构27:矩阵加法(基于十字链表)
- 【数据结构】算法7.3 图的存储结构-十字链表