| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 377 人关注过本帖
标题:课程设计,好多错误,折磨了 N 天,求助
只看楼主 加入收藏
a2043109
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2014-6-2
结帖率:100%
收藏
已结贴  问题点数:16 回复次数:2 
课程设计,好多错误,折磨了 N 天,求助
#include<stdio.h>   
#include<stdlib.h>  
#include<malloc.h>   
#define MaxNum 10 //定义一个全局常量,用来改变装头结点的数组的长度   
   
   
/********************  定义结构   ***********************/   
typedef struct Node   
{   
    int row,col;   
    int value;   
    struct Node *right,*down;   
}SMNode, *SMLink; //定义节点,每个节点含有五个域,矩阵元素的行号row,列号col,值e,指向下一个节点的指针right和down   
   
typedef struct SMatrix   
{   
    SMLink h;   
    int mu,nu,tu;   
}SMatrix;//定义矩阵,该结构含四个域:头节点,矩阵的行数mu,列数nu,以及矩阵中非零元的个数   
   
SMatrix sm[MaxNum];//定义一个数组,用来存放矩阵的头节点,该系统可处理矩阵的最大数量为MaxNum   
   
   
/********************  函数声明   ***********************/   
void InitSMatix();//初始化函数   
void CreateSMatrix();//建立矩阵函数   
void InsertSMatrix(smm,int i,int j,int e); //插入节点函数,在建立矩阵时需要调用   
void DestroySMatrix(int n); //删除矩阵函数   
int PrintSMatrix(int n); //打印矩阵函数   
void AddSMatrix(); //矩阵加法函数   
void SubSMatrix();  //矩阵减法函数   
void MultSMatrix(); //矩阵乘法函数   
void TransposeSMatrix(int n);//矩阵转置函数   
int show();//界面提示函数   
   
   
/******************** 初始化函数  ***********************/   
void InitSMatix()   
{   
    SMLink p;   
    int i;   
    for(i=0;i<MaxNum;i++)   
    {   
        if(!(p=(SMLink)malloc(sizeof(SMNode))))   
            printf("OVERFLOW\n");   
            sm[i].h=p;//建立头节点,并把头节点置空   
               p->row=NULL;   
               p->col=NULL;   
               p->value=NULL;   
               p->right=NULL;   
               p->down=NULL;   
    }   
}//InitSmatixList   
   
   
/********************  矩阵创建函数  ***********************/   
void CreateSMatrix()   
{   
    SMLink p;   
    int i,j,e,m,n;   
    int temp;   
    for(m=0;m<MaxNum;m++)   
        if((sm[m].h)->right==NULL)   
            break;   
    if(m==MaxNum)   
    {   
        printf("内存已满!");   
        return;   
    }//查找空的存储空间,确认有足够的存储空间   
           
    printf("\n请输入矩阵的行数:");   
    scanf("%d",&sm[m].mu);
    printf("\n请输入矩阵的列数:");   
    scanf("%d",&sm[m].nu);   
    temp=sm[m].mu*sm[m].nu;//输入矩阵的特征值:行数,列数,非零元个数   
    do   
    {   
       printf("\n请输入矩阵的非零元个数:");
       scanf("%d",&sm[m].tu);
       if(sm[m].tu>temp)   
           printf("结点数超出矩阵范围,请确认输入!\n");   
    }while(sm[m].tu>temp);//确认节点个数正确   
           
    for(n=1;n<=sm[m].tu;n++)   
    {   
        do   
        {   
            printf("请输入第%d个非零元的行号:",n);   
            scanf("%d",i);   
            if(i>sm[m].mu) printf("ERROR!\n");   
        }while(i>sm[m].mu);   
        do   
        {   
            printf("请输入第%d个非零元的列号:",n);   
            scanf("%d",j);   
            if(j>sm[m].nu) printf("ERROR!\n");   
        }while(j>sm[m].nu);   
        printf("请输入第%d个非零元的值:",n);   
        scanf("%d",e);   
        InsertSMatrix(sm[m],i,j,e); //输入一个新的节点,并利用插入函数将其联入链表中   
    }   
      
    p=sm[m].h;   
    while(p->right!=NULL)   
        p=p->right;   
    p->right=sm[m].h;   
    p=sm[m].h;   
    while(p->down!=NULL)   
        p=p->down;   
    p->down=sm[m].h;//最后连上头结点形成循环链表   
}//CreateSMatrix   
   
/********************  插入结点函数  ***********************/   
void InsertSMatrix(SMatrix &smm,int i,int j,int e)   
{   
    SMLink p,q,r;   
    p=smm.h;   
    while(p->right!=NULL&&p->row<i)   
    {   
        q=p;   
        p=p->right;   
    }//用两个指针找到插入节点的位置   
    if(p->row>i)//情况一:插入节点的行号刚好介于p,q指针所指节点的行号之间,插在它们之间即可   
    {   
        if(!(r=(SMLink)malloc(sizeof(SMNode))))   
            printf("OVERFLOW");   
        r->row=i;   
        r->col=j;   
        r->value=e;   
        r->right=p;   
        r->down=NULL;   
        q->right=r;   
    }   
    else if(p->row==i) //情况二:p的行号与插入节点的行号相等,   
    {   
        while((p->right!=NULL)&&(p->col<j)&&(p->row==i))   
        {   
            q=p;   
            p=p->right;   
        }   
        if(p->row==i&&p->col==j) //确定插入的位置没有节点   
        {   
            printf("已存在,请确认输入!");   
            return;   
        }   
        else if(p->row==i&&p->col>j)//在行号相等时,若列号位于p,q之间时插在其间即可   
        {   
   
            if(!(r=(SMLink)malloc(sizeof(SMNode))))   
                printf("OVERFLOW");   
            r->row=i;   
            r->col=j;   
            r->value=e;   
            r->right=p;   
            r->down=NULL;   
            q->right=r;   
        }   
        else if(p->row>i)   
        {   
            if(!(r=(SMLink)malloc(sizeof(SMNode))))   
                printf("OVERFLOW");  
            r->row=i;   
            r->col=j;   
            r->value=e;   
            r->right=p;   
            r->down=NULL;   
            q->right=r;   
        }   
        else if(p->right==NULL)//新插入的节点为行号列号最大的节点,直接插在末尾即可   
        {   
            if(!(r=(SMLink)malloc(sizeof(SMNode))))   
                printf("OVERFLOW");   
            r->row=i;   
            r->col=j;   
            r->value=e;   
            r->right=NULL;   
            r->down=NULL;   
            p->right=r;   
        }   
    }   
    else if(p->right==NULL)  //新插入的节点为行号列号最大的节点,直接插在末尾即可   
    {   
        if(!(r=(SMLink)malloc(sizeof(SMNode))))   
            printf("OVERFLOW");
        r->row=i;   
        r->col=j;   
        r->value=e;   
        r->right=NULL;   
        r->down=NULL;   
        p->right=r;   
    }   
   
    //以下为将节点安列再次插入,其算法与按行插入完全相同   
    p=smm.h;   
    while(p->down!=NULL&&p->col<j)   
    {   
        q=p;   
        p=p->down;   
    }   
    if(p->col>j)   
    {   
        if(!(r=(SMLink)malloc(sizeof(SMNode))))   
            printf("OVERFLOW");   
        r->row=i;   
        r->col=j;   
        r->value=e;   
        r->right=NULL;   
        r->down=p;   
        q->down=r;   
    }   
    else if(p->col==j)   
    {   
        while((p->down!=NULL)&&(p->row<i)&&(p->col==j))   
        {   
            q=p;   
            p=p->down;   
        }   
        if(p->col==j&&p->row==i)   
        {   
            printf("已存在,请确认输入!");   
            return;   
        }   
        else if(p->col==j&&p->row>i)   
        {   
   
            if(!(r=(SMLink)malloc(sizeof(SMNode))))   
                printf("OVERFLOW");   
            r->row=i;   
            r->col=j;   
            r->value=e;   
            r->right=NULL;   
            r->down=p;   
            q->down=r;   
        }   
        else if(p->col>j)   
        {   
            if(!(r=(SMLink)malloc(sizeof(SMNode))))   
                printf("OVERFLOW");   
            r->row=i;   
            r->col=j;   
            r->value=e;   
            r->right=NULL;   
            r->down=p;   
            q->down=r;   
        }   
        else if(p->down==NULL)   
        {   
            if(!(r=(SMLink)malloc(sizeof(SMNode))))   
                printf("OVERFLOW");   
            r->row=i;   
            r->col=j;   
            r->value=e;   
            r->right=NULL;   
            r->down=NULL;   
            p->down=r;   
        }   
    }   
    else if(p->down==NULL)   
    {   
        if(!(r=(SMLink)malloc(sizeof(SMNode))))   
            printf("OVERFLOW");  
        r->row=i;   
        r->col=j;   
        r->value=e;   
        r->right=NULL;   
        r->down=NULL;   
        p->down=r;   
    }//按列插入结束   
}//InsertSMartrix   
   
   
/********************  矩阵删除函数  ***********************/   
void DestroySMatrix(int n)   
{   
    SMLink p,q,r;   
    p=sm[n].h;   
    if(p->right==NULL)   
    {   
        printf("矩阵不存在,请确定输入!\n");   
        return;   
     }        
    q=p->right;   
    r=p->down;   
      
    while(q!=sm[n].h)   
    {   
        p=q;   
        q=q->right;   
        delete p;   
    }   
    while(r!=sm[n].h)   
    {   
        p=r;   
        r=r->down;   
        delete p;   
    }   
    sm[n].h->right=NULL;//在删除后将头节点置为空   
    sm[n].h->down=NULL;   
    sm[n].mu=NULL;   
    sm[n].nu=NULL;   
    sm[n].tu=NULL;   
    printf("删除成功!\n");   
}//DestroySMatrix   
   
/********************  打印函数  ***********************/   
   
int PrintSMatrix(int n)   
{   
    SMLink p;   
    int i,j;   
    int k=0;   
      
    p=sm[n].h;   
    if(p->right==NULL)   
    {   
        printf("矩阵不存在,请确定输入!\n");   
        return 0;   
     }//确认要打印的矩阵存在   
    p=p->right;//为按行打印矩阵做准备   
    for(i=1;i<=sm[n].mu;i++)   
    {   
        for(j=1;j<=sm[n].nu;j++)   
        {   
            if(p->row==i&&p->col==j)//若i行,j列的元素存在,则打印   
            {   
                printf("%4d",p->value);//打印四个空格   
                p=p->right;   
                k++;   
            }   
            else   
                printf("%4d",0);;//否则输出零   
        }   
        printf("\n");   
    }   
    return k;//返回矩阵非零元的个数   
}//PrintSMatrix   
   
/********************  显示函数  ***********************/   
int show()   
{   
    int i,c;   
    do   
    {   
        for(i=0;i<MaxNum;i++)   
        {   
            if((sm[i].h)->right!=NULL)   
                printf("%d:%dX%d\n",i,sm[i].mu,sm[i].nu);  
            else   
                printf("%d:NULL\n",i);  
        }   
        printf("请选择输出矩阵(0--9,退出-1):");   
        scanf("%d",&c);   
        if((c<0||c>9)&&c!=-1)   
            printf("输入错误,请重新输入!\n");   
        if(c>=0&&c<=9) break;   
    }while(c!=-1);   
    return c;//显示要用到的函数的标号,并返回其标号   
}   
   
   
   
/********************  加法函数  ***********************/   
void AddSMatrix()   
{   
    SMLink p,q;   
    int i,j,m,e;   
    int a,b;   
   
    a=show();//输入第一个用来进行加法的矩阵标号   
    b=show();//输入另一个用来进行加法的矩阵标号   
    if((sm[a].mu!=sm[b].mu)||(sm[a].nu!=sm[b].nu))   
    {   
        printf("矩阵行列不匹配,请重新输入!\n");   
        return;   
    }//判断矩阵的形状是否相同   
    else   
    {   
        for(m=0;m<MaxNum;m++)   
            if((sm[m].h)->right==NULL) break;   
        if(m==MaxNum)   
        {   
            printf("内存已满!\n");   
            return;   
        }//判断是否有存储空间   
        sm[m].mu=sm[a].mu;   
        sm[m].nu=sm[a].nu;//对结果矩阵进行初始化:给出其行数和列数。   
    }   
    p=(sm[a].h)->right;   
    q=(sm[b].h)->right;//为按行实现加法做准备   
    for(i=1;i<=sm[a].mu;i++)   
        for(j=1;j<=sm[a].nu;j++)   
        {   
            if((p->row==i&&p->col==j)&&(q->row==i&&q->col==j))//如果两个矩阵i行,j列的元素都不为零,相加   
            {   
                e=p->value+q->value;   
                if(e!=0) InsertSMatrix(sm[m],i,j,e);//相加结果若不为零,则调用插入函数,将该节点插入新的矩阵中   
                p=p->right;   
                q=q->right;//两指针右移   
            }   
            else if(p->row==i&&p->col==j)//仅仅第一个矩阵的i行,j列元素不为零,直接将其插入新的矩阵即可   
            {   
                e=p->value;   
                InsertSMatrix(sm[m],i,j,e);   
                p=p->right;   
            }   
            else if(q->row==i&&q->col==j)//第二个矩阵的 i行,j列元素不为零,处理同上   
            {   
                e=q->value;   
                InsertSMatrix(sm[m],i,j,e);   
                q=q->right;   
            }   
        }   
    p=sm[m].h;   
    while(p->right!=NULL)   
        p=p->right;   
    p->right=sm[m].h;   
    p=sm[m].h;   
    while(p->down!=NULL)   
        p=p->down;   
    p->down=sm[m].h; //将新矩阵的最后一个节点的RIGHT或DOWN域连在头节点上,形成循环链表   
    printf("矩阵相加结果为:\n");   
    sm[m].tu=PrintSMatrix(m);//调用打印函数,返回新的矩阵的非零元的个数   
}//AddSMatrix   
   
   
/********************  减法函数  ***********************/   
void SubSMatrix()//核心算法与加法完全相同,不加赘述   
{   
    SMLink p,q;   
    int i,j,m,e;   
    int a,b;   
      
    a=show();   
    b=show();   
    if((sm[a].mu!=sm[b].mu)||(sm[a].nu!=sm[b].nu))   
    {   
        printf("矩阵行列不匹配,请重新输入!\n");  
        return;   
    }   
    else   
    {   
        for(m=0;m<MaxNum;m++)   
            if((sm[m].h)->right==NULL) break;   
        if(m==MaxNum)   
        {   
            printf("内存已满!\n");   
            return;   
        }   
        sm[m].mu=sm[a].mu;   
        sm[m].nu=sm[a].nu;   
    }   
    p=(sm[a].h)->right;   
    q=(sm[b].h)->right;   
    for(i=1;i<=sm[a].mu;i++)   
        for(j=1;j<=sm[a].nu;j++)   
        {   
            if((p->row==i&&p->col==j)&&(q->row==i&&q->col==j))   
            {   
                e=p->value-q->value;   
                if(e!=0) InsertSMatrix(sm[m],i,j,e);   
                p=p->right;   
                q=q->right;   
            }   
            else if(p->row==i&&p->value==j)   
            {   
                e=p->value;   
                InsertSMatrix(sm[m],i,j,e);   
                p=p->right;   
            }   
            else if(q->row==i&&q->value==j)   
            {   
                e=0-q->value;   
                InsertSMatrix(sm[m],i,j,e);   
                q=q->right;   
            }   
        }   
    p=sm[m].h;   
    while(p->right!=NULL)   
        p=p->right;   
    p->right=sm[m].h;   
    p=sm[m].h;   
    while(p->down!=NULL)   
        p=p->down;   
    p->down=sm[m].h;   
    printf("矩阵相减结果为:\n");   
    sm[m].tu=PrintSMatrix(m);   
}//SubSMatrix   
   
/****************  乘法函数   ********************/   
void MultSMatrix()   
{   
    int c1,c2;   
    c1=show();   
    c2=show();//输入两个已存储的矩阵   
    int i,j,m,sum;   
    SMLink p,q,r;   
    p=sm[c1].h;   
    q=sm[c2].h;   
        if(p->right==NULL||q->right==NULL||sm[c1].nu!=sm[c2].mu)   
             printf("矩阵为空或行列不匹配,其检查错误!\n");   
             else   
             {   
                for(m=0;m<MaxNum;m++)   
                    if((sm[m].h)->right==NULL)   
                       break;   
                 if(m==MaxNum)   
                 {   
                    printf("内存已满请删除!") ;   
                    return;   
                 }   
                 sm[m].mu=sm[c1].mu;   
                 sm[m].nu=sm[c2].nu;//结果矩阵的特征值:行数和列数   
                 p=p->right;//第一个矩阵按行搜索   
                 q=q->down;//第二个矩阵安列搜索   
                    for(i=1;i<=sm[c1].mu;i++)   
                       for(j=1;j<=sm[c2].nu;j++)   
                          {   
                              sum=0;   
                              while(p->row==i&&q->col==j)   
                               {   
                                   while(p->col>q->row)   
                                        q=q->down;   
                                   while(p->col<q->row)   
                                        p=p->right;//以上两个循环用来寻找两个矩阵i行,j列的元素都不为零   
                                   sum=sum+p->value*q->value;   
                                   p=p->right;   
                                   q=q->down;   
                               }   
                              if(sum!=0)   
                                  InsertSMatrix(sm[m],i,j,sum);   
                           }   
    p=sm[m].h;   
    while(p->right!=NULL)   
        p=p->right;   
    p->right=sm[m].h;   
    p=sm[m].h;   
    while(p->down!=NULL)   
        p=p->down;   
    p->down=sm[m].h;   
    printf("矩阵相乘结果为:\n");//链表头,形成循环链表   
    sm[m].tu=PrintSMatrix(m); //调用打印函数,返回新的矩阵的非零元的个数   
    }   
}//MultSMatrix   
   
/****************  转置函数   ********************/   
void TransposeSMatrix(int n)   
{   
    int m;   
    int ti,tj,te,k;   
    SMLink p;   
    if((sm[n].h)->right==NULL)   
    {   
        printf("矩阵不存在,请确认输入!\n");   
        return;   
    }   
    else   
    {   
        for(m=0;m<MaxNum;m++)   
            if((sm[m].h)->right==NULL) break;   
        if(m==MaxNum)   
        {   
            printf("内存已满!\n");   
            return;   
        }   
        sm[m].mu=sm[n].nu;   
        sm[m].nu=sm[n].mu;   
        sm[m].tu=sm[n].tu;//矩阵转置的初始化,行数列数调换 ,非零元个数不改变   
    }   
    p=sm[n].h;   
    for(k=0;k<sm[n].tu;k++)   
    {   
        p=p->right;   
        ti=p->row;   
        tj=p->col;   
        te=p->value;   
        InsertSMatrix(sm[m],tj,ti,te);   
    }//利用插入函数轻松搞定   
    p=sm[m].h;   
    while(p->right!=NULL)   
        p=p->right;   
    p->right=sm[m].h;   
    p=sm[m].h;   
    while(p->down!=NULL)   
        p=p->down;   
    p->down=sm[m].h;   
    printf("矩阵转置结果为:\n");   
    PrintSMatrix(m);   
}//TransposeSMatrix   
   
void main()   
{   
    int n;   
    char c;   
    InitSMatix();   
    do   
    {   
        printf("\n\t\t\t  ******************************\n");   
        printf("  \t\t\t  *    稀 疏 矩 阵 运 算 器    *\n");   
        printf("  \t\t\t  ******************************\n");   
        printf("  \t\t\t  *         1-->创建矩阵       *\n");   
        printf("  \t\t\t  *         2-->输出矩阵       *\n");   
        printf("  \t\t\t  *         3-->删除矩阵       *\n");   
        printf("  \t\t\t  *         4-->加法运算       *\n");   
        printf("  \t\t\t  *         5-->减法运算       *\n");   
        printf("  \t\t\t  *         6-->乘法运算       *\n");   
        printf("  \t\t\t  *         7-->转置运算       *\n");   
        printf("  \t\t\t  *         8-->退出           *\n");   
        printf("  \t\t\t  ******************************\n");   
        printf("\t\t\t\t请输入(1--8):");   
        scanf("%d",&c);   
        switch(c)   
        {   
            case '1':CreateSMatrix();break;   
            case '2':n=show();PrintSMatrix(n);break;   
            case '3':n=show();DestroySMatrix(n);break;   
            case '4':AddSMatrix();break;   
            case '5':SubSMatrix();break;   
            case '6':MultSMatrix();break;   
            case '7':n=show();TransposeSMatrix(n);break;   
            case '8':break;   
            default:printf("输入错误!请重新输入!\n");   
        }   
        if(c=='8') break;   
    }while(c!='8');   
}//main
搜索更多相关主题的帖子: include 课程 
2014-06-05 13:25
砖家的谎言
Rank: 12Rank: 12Rank: 12
等 级:禁止访问
威 望:30
帖 子:693
专家分:3898
注 册:2013-12-6
收藏
得分:16 
这是你自己写的还是网上copy的啊

我不是砖家,要努力成为砖家。
2014-06-05 13:43
a2043109
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2014-6-2
收藏
得分:0 
回复 2 楼 砖家的谎言
本来是一个c++程序,修改的。
2014-06-05 13:52
快速回复:课程设计,好多错误,折磨了 N 天,求助
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.031658 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved