• 十字链表


    #include<stdio.h>
    #include<malloc.h>
    #define smax 45
    typedef int datatype;
    typedef struct lnode   int i,j;
     struct lnode *cptr,*rptr;
     union
     {
      struct lnode *next;
      datatype v;
     }uval;
    }link;
    int flag=0;


    link *creatlinkmat()
    {
     link *p,*q,*head,*cp[smax];
     int i,j,k,m,n,t,s;
     datatype v;
     printf("Print m,n,t:\n");
     scanf("%d,%d,%d",&m,&n,&t); 
     if(m>n)s=m; else s=n; 
     head=(link *)malloc(sizeof(link));  
     head->i=m;head->j=n;
     cp[0]=head;   

     for(i=1;i<=s;i++)  {
      p=(link *)malloc(sizeof(link));
      p->i=0;p->j=0;
      p->rptr=p;p->cptr=p;
      cp[i]=p; cp[i-1]->uval.next=p;
     }
     cp[s]->uval.next=head;
     for(k=1;k<=t;k++)
     {
      printf("\t Print i,j,v:",k);
      scanf("%d%d%d",&i,&j,&v);
      p=(link *)malloc(sizeof(link));
      p->i=i;p->j=j;p->uval.v=v;
      q=cp[i];
      while((q->rptr!=cp[i])&&(q->rptr->j<j))
       q=q->rptr;
      p->rptr=q->rptr;
      q->rptr=p;
      q=cp[j];
      while((q->cptr!=cp[j])&&(q->cptr->i<i))
       q=q->cptr;
      p->cptr=q->cptr;
      q->cptr=p;
     }
     return head;
    }

    void insert(int i,int j,int v,link *cp[])
    {
     link *p,*q;
     p=(link *)malloc(sizeof(link));
     p->i=i;p->j=j;p->uval.v=v;
     
     q=cp[i];
     while((q->rptr!=cp[i])&&(q->rptr->j<j))
      q=q->rptr;
     
     p->rptr=q->rptr;
     q->rptr=p;
     
     q=cp[j];
     while((q->cptr!=cp[j])&&(q->cptr->i<i))
      q=q->cptr ;
     
     p->cptr=q->cptr;
     q->cptr=p;
    }


    void print(link *A)
    {
     link *p,*q,*r;
     int k,col,t,row;
     col=A->j;
     printf("The Matrix:\n");
     p=A->uval.next;
     while(p!=A)
     {
      q=p->rptr;
      if(q==A->cptr)break;
      r=p;
      while(q!=p)
      {
       for(k=1;k<q->j-(r->j);k++)
        printf("  0");
       printf("%3d",q->uval.v);
       q=q->rptr;
       r=r->rptr;
      }
      k=r->j;
      for(t=k;t<col;t++)
       printf("  0");
      printf("\n");
      p=p->uval.next;
     }
    }
    link *add(link *a,link *b)
    {
     link *p,*q,*u,*v,*r,*cp[smax],*c; int s,i;
     if(a->i!=b->i||a->j!=b->j)
     { flag=1;return NULL; }
     
     c=(link *)malloc(sizeof(link));
     c->i=a->i;c->j=a->j;
     if(c->i>c->j)s=c->i; else s=c->j;
     cp[0]=c;
     for(i=1;i<=s;i++)
     {
      r=(link *)malloc(sizeof(link));
      r->i=0;r->j=0;
      r->rptr=r;r->cptr=r;
      cp[i]=r;
      cp[i-1]->uval.next=r;
     }
     cp[s]->uval.next =c; 
      
     p=a->uval.next;u=b->uval.next;
     while(p!=a&&u!=b)
     {
      q=p->rptr;v=u->rptr;
      if(q==p&&v!=u)
       while(v!=u)
       {insert(v->i,v->j,v->uval.v,cp);v=v->rptr;}
      else if(v==u&&q!=p)
       while(q!=p)
       {insert(q->i,q->j,q->uval.v,cp);q=q->rptr;}
      else if(q!=p&&v!=u)
      {
       while(q!=p&&v!=u)
       {
        if(q->j<v->j)
        {insert(q->i,q->j,q->uval.v,cp);q=q->rptr;}
        else if(q->j>v->j)
        {insert(v->i,v->j,v->uval.v,cp);v=v->rptr;}
        else
        {if(q->uval.v+v->uval.v!=0)insert(q->i,q->j,(q->uval.v+v->uval.v),cp);
         q=q->rptr;v=v->rptr;
        }
       }
       if(q==p&&v!=u)
        while(v!=u)
        {insert(v->i,v->j,v->uval.v,cp);v=v->rptr;}
       else if(v==u&&q!=p)
         while(q!=p)
         {insert(q->i,q->j,q->uval.v,cp);q=q->rptr;}
       else; 
      }
      else ; 
       
      p=p->uval.next;u=u->uval.next;
     }
     return c;
    }

    void main()
    {
     link *A,*B,*C;
     A=creatlinkmat();print(A);
     B=creatlinkmat();print(B);
     C=add(A,B);
     if(flag==1)printf("A,B can not plus!");
     else printf("Matrix c is:\n");print(C);
     getch();
    }

  • 相关阅读:
    数字电路与系统-公式规则知识点
    数字电路与系统-门电路基本知识1
    数字电路与系统-数制与编码2
    数字电路与系统-数制与编码1
    数字电路与系统-知识点2
    数字电路与系统-知识点1
    数字电路与系统-编码器
    数字电路与系统-组合逻辑电路的竞争冒险现象3
    数字电路与系统-组合逻辑电路的竞争冒险现象2
    前端工程师提高工作效率的几个小技巧
  • 原文地址:https://www.cnblogs.com/djcsch2001/p/2035165.html
Copyright © 2020-2023  润新知