//我有个建立的用c++.net写的老窖了 加法自己做嘛 也不难的
//main.cpp
#include "stdafx.h"
#include
#include
#include
#include
#include"data_structure.h"
#include"tripleTable_class.h"
#include"tripleTable_function.h"
#include"crossLink_class.h"
#include"crossLink_function.h"
using namespace std;
void _tmain()
{
int h,l;
CrossLink *cross=new CrossLink();
int num[][6]={{3,0,0,0,0,7},{0,0,6,0,0,0},{2,3,0,0,0,0},{0,0,0,0,0,0},{0,0,0,0,2,0}};//存储的矩阵
h=sizeof(num)/sizeof(num[0]);
l=(sizeof(num)/sizeof(num[0][0]))/(sizeof(num)/sizeof(num[0]));
cross->save_crossNode(&num[0][0],h,l,cross->get(&num[0][0],h,l));
}
//crossLink_class.h 文件
#pragma once
#include"data_structure.h"
__gc class CrossLink
{
public:
void save_crossNode(int *num,int h,int l,int n);
int get(int *num,int h,int l);
};
//crossLink_function.h 文件
#include"crossLink_class.h"
#include"data_structure.h"
#include
using namespace std;
void CrossLink::save_crossNode(int *num,int h,int l,int n)
{
//存储矩阵
DWORD start,end;
start=clock();
int i,j;
CrossNode *H=new CrossNode[h+1];
CrossNode *L=new CrossNode[l+1];
CrossNode p,q,s;
for(int k=0;k
for(int k=0;k
for(i=0;i
if(*(num+i*l+j)!=0)
{
s=(CrossNode)malloc(sizeof(CrossNode));
s->x=i+1;
s->y=j+1;
s->z=*(num+i*l+j);
s->down=s->right=NULL;
q=NULL;
p=H[s->x];
while((p!=NULL)&&s->y>p->y)
{
q=p;
p=p->right;
}
if(p==NULL)
{
if(q==NULL)//该行的第一个元素
H[s->x]=s;
else//其他位置
q->right=s;
}
q=NULL;
p=L[s->y];
while((p!=NULL)&&s->x>p->x)
{
q=p;
p=p->down;
}
if(p==NULL)
{
if(q==NULL)//该列的第一个元素
L[s->y]=s;
else//其他位置
q->down=s;
}
}
}
end=clock();
//输出十字链表
int number;
int key=1;
printf("十字链表输出:");
while(key)
{
printf("\n1---按行输出");
printf("\n2---按列输出");
printf("\n3---exit");
printf("\n数字:");
cin>>number;
switch(number)
{
case 1:
{
//行的顺序递增
printf("\n按行输出:\n");
for(i=1;i
p=H[i];
while(p)
{
printf("%d\t%d\t%d\n",p->x,p->y,p->z);
p=p->right;
}
}
cout<<"十字链表存储时间为:"<
}
case 2:
{
//列的顺序递增
printf("\n按列输出:\n");
for(i=1;i
p=L[i];
while(p)
{
printf("%d\t%d\t%d\n",p->x,p->y,p->z);
p=p->down;
}
}
cout<<"十字链表存储时间为:"<
}
case 3:key=0;break;
default:
{
printf("error!");
break;
}
}
}
}
//获得非零元素个数
int CrossLink::get(int *num,int h,int l)
{
int i,j;
int number=0;
for(i=0;i
if(*(num+i*l+j)!=0)
number+=1;
}
return number+1;
}