论坛首页 编程语言技术论坛

十字链表定义创建查找

浏览 2120 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-06-29  
C
#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;
}
 
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics