队列堆栈和数组-十字链表矩阵

#include<iostream>
#include <iomanip>
#include"windows.h"
using namespace std;
struct OLinMatrixkNode
{
    int data;
    int x,y;
    OLinMatrixkNode* right;
    OLinMatrixkNode* down;
};
struct OLinMatrix
{
    OLinMatrixkNode** RowHead;
    OLinMatrixkNode** ColHead;
    int r,c,cnt;
};
OLinMatrix* createOLinMatrix(int r,int c)
{
    OLinMatrix* ans=(OLinMatrix*)malloc(sizeof(OLinMatrix));
    ans->RowHead=new OLinMatrixkNode*[r+1];
    ans->ColHead=new OLinMatrixkNode*[c+1];
    for(int i=1;i<=r;i++)
        ans->RowHead[i]=NULL;
    for(int i=1;i<=c;i++)
        ans->ColHead[i]=NULL;
    ans->cnt=0;
    ans->r=r;
    ans->c=c;
    return ans;
}

OLinMatrixkNode* createOLinMatrixNonde(int r,int c,int v)
{
    OLinMatrixkNode* ans=(OLinMatrixkNode*)malloc(sizeof(OLinMatrixkNode));
    ans->x=r;
    ans->y=c;
    ans->data=v;
    return ans;
}
void addElement(OLinMatrix* p,int r,int c,int v)
{
    if(v==0)
        return;

    OLinMatrixkNode* newNode = createOLinMatrixNonde(r,c,v);
    if(p->RowHead[r]==NULL || p->RowHead[r]->y > c)
    {
        newNode->right=p->RowHead[r];
        p->RowHead[r]=newNode;
    }
    else 
    {
        OLinMatrixkNode* temp = p->RowHead[r];
        while( temp->right!=NULL && temp->right->y <= c)
            temp=temp->right;
        newNode->right=temp->right;
        temp->right=newNode;
    }

    if(p->ColHead[c]==NULL || p->ColHead[c]->x > r)
    {
        newNode->down=p->ColHead[c];
        p->ColHead[c]=newNode;
    }
    else 
    {
        OLinMatrixkNode* temp = p->ColHead[c];
        while( temp->down!=NULL && temp->down->x <= r)
            temp=temp->down;
        newNode->down=temp->down;
        temp->down=newNode;
    }
    p->cnt++;
}

void output(OLinMatrix* p)
{
    for(int i=1;i<=p->r;i++)
    {
        OLinMatrixkNode* temp = p->RowHead[i];
        for(int j=1;j<=p->c;j++)
        {
            if(temp!=NULL && temp->y==j)
            {
                SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN);//彰显非0元
                cout<<std::left<<setw(3)<<temp->data;
                SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);//设置三色相加
                temp=temp->right;
            }
            else
            {
                cout<<std::left<<setw(3)<<0;
            }
        }
        cout<<endl;
    }
}

void main()
{
    int r=7,c=12,cnt=15;
    OLinMatrix*  m= createOLinMatrix(r,c);
    bool v[100][100];
    memset(v,false,sizeof(100));
    for(int i=1;i<=cnt;i++)
    {
        int x=rand()%r+1,y=rand()%c+1,value=rand()%99+1;
        if(v[x][y])
        {
            addElement(m,x,y,value);
            cout<<x<<" "<<y<<" "<<value<<endl;
            v[x][y]=0;
        }
        else 
        {
            i--;
        }
    }
    output(m);
    cin>>r;
}

 

posted @ 2014-09-28 17:14  kbyd  阅读(168)  评论(0编辑  收藏  举报