#include<iostream>
#define TRUE 1
#define FALSE 0
#define MAX 999
using namespace std;
//十字链表的元素定义
typedef struct OLNode{
OLNode *right;
OLNode *down;
int iIndex,jIndex,value;
}OLNode,*OLink;
//十字链表的定义
typedef struct CrossList{
OLink rhead[MAX+1],chead[MAX+1];
int m,n,len;
}CrossList;
//创建十字链表
void CreateCrossList(CrossList *M)
{
int m,n,len,k;
cout<<"输入十字链表的行数,列数,元素个数\n";
cin>>m>>n>>len;
M->m=m;M->n=n;M->len=len;
//每行每列头指针初始为空
for(k=1;k<=M->m;k++) M->rhead[k]=NULL;
for(k=1;k<=M->n;k++ ) M->chead[k]=NULL;
int row,col,value;
//将元素插入到十字链表中
for(cin>>row>>col>>value;row!=0;cin>>row>>col>>value)
{
OLNode *p=(OLNode*)malloc(sizeof(OLNode));
p->iIndex=row;p->jIndex=col;
p->value=value;
OLNode *q1=M->rhead[row];
//如果该行头指针为空,或者该行头指针指向元素的列标大于插入的列标
if(q1==NULL||M->rhead[row]->jIndex>col){
p->right=M->rhead[row];
M->rhead[row]=p;
}
else{
//寻找插入点
for(;q1->right!=NULL&&q1->right->jIndex<col;q1=q1->right);
p->right=q1->right;q1->right=p;
}
q1=M->chead[col];
if(q1==NULL||M->chead[col]->iIndex>row){
p->down=M->chead[col];
M->chead[col]=p;
}
else{
for(;q1->down!=NULL&&q1->down->iIndex<row;q1=q1->down);
p->down=q1->down;q1->down=p;
}
}
}
//输出十字链表的内容
void PrintCrossList(CrossList *M)
{
int rowLength=M->m,currentRow=1;
for(int row=1;row<=rowLength;row++)
{
OLNode *p=M->rhead[row];
while(p!=NULL)
{
cout<<p->value<<" ";
p=p->right;
}
cout<<"\n";
}
}
//查找i行,j列元素的值,找不到返回-1
int FindNode(CrossList *M,int i,int j)
{
if(i>M->m||i<=0||j>M->n||j<=0){
cout<<"不存在该元素\n";
return -1;
}
OLNode *p=M->rhead[i];
for(;p!=NULL&&p->jIndex<j;p=p->right);
if(p==NULL||p->jIndex>j) return 0;
return p->value;
}
int main()
{
char cmd;
int i,j;
do{
CrossList *M=(CrossList*)malloc(sizeof(CrossList));
CreateCrossList(M);
PrintCrossList(M);
cout<<"查找某一元素的值,请输入i,j\n";
cin>>i>>j;
cout<<"元素的值为\n";
cout<<FindNode(M,i,j)<<"\n";
cout<<"Y/y继续\n";
cin>>cmd;
}while(cmd=='Y'||cmd=='y');
return 0;
}
十字链表定义创建查找
最新推荐文章于 2023-07-25 19:41:06 发布
本文介绍了一种使用十字链表的数据结构来存储稀疏矩阵的方法,并提供了创建、打印十字链表及查找特定元素值的功能。
1084

被折叠的 条评论
为什么被折叠?



