其他分享
首页 > 其他分享> > 链表和广义表的习题

链表和广义表的习题

作者:互联网

答案:

// 总的代码,包括存储结构、初始化创建、输出个数
#include<stdio.h>
#include<malloc.h>
//十字链表的存储结构
typedef struct OLNode{
    // 非零元素的行和列下标
    int i,j;  
    int e;
    // 非零元素所在行表列表的后继链域
    struct OLNode * right, *down;             
}OLNode,*OLink; 

typedef struct{
    //行、列链表的头指针向量基址
    OLink *rhead,*chead;
    //稀疏矩阵的行数、列数
    int  mu, nu;    
}CrossList; 
//创建链表
int CreateCrossList (CrossList * M){
    int m,n,t,i,j,e;
    OLink q;
    //采用十字链表存储结构,创建稀疏矩阵M  
    printf("输入M的行数,列数和非零元素的个数\n");
    scanf("%d %d %d",&m,&n,&t);  //输入M的行数,列数和非零元素的个数 
    M->mu=m;M->nu=n;
    if(!((OLink *)M->rhead=(OLink *)malloc((m+1)*sizeof(OLink)))) return 0; 
    if(!((OLink *)M->chead=(OLink *)malloc((n+1)*sizeof(OLink)))) return 0; 
    for(int i=0;i<=m;i++){
        M->rhead[i]=NULL;
    }
    for(int j=0;j<=n;j++){
        M->chead[j]=NULL;
    }   
    //初始化行、列头指针向量,各行、列链表为空的链表  
    printf("初始化行、列、数\n");
    printf("停止时需要输入行数为0\n");
    for(scanf("%d %d %d",&i,&j,&e);i!=0;scanf("%d %d %d",&i,&j,&e)){
        OLink p;
        if(!(p=(OLink)malloc(sizeof(OLNode)))) 
            return 0; 
        p->i=i;
        p->j=j;
        p->e=e;  //生成结点 
        p->right=NULL;
        p->down=NULL;
        if(M->rhead[i]==NULL)   
            M->rhead[i]=p; 
        else{  
            /*寻找行表中的插入位置*/ 
            for(q=M->rhead[i];q->right&&q->right->j<j;q=q->right){}
                p->right=q->right; q->right=p;  /*完成插入*/ 
        }
        if(M->chead[j]==NULL){
            M->chead[j]=p;
        }else{  /*寻找列表中的插入位置*/
            for(q=M->chead[j];q->down&&q->down->i<i;q=q->down){}
                p->down=q->down; q->down=p;   /*完成插入*/ 
        } 
    } 
} 
int NonzeroNumber(CrossList M){
    int i;
    int number=0;
    for(i=1;i<=M.nu;i++){
        if(M.chead[i]!=NULL){
            OLink q=M.chead[i];
            while(q){
                number++;
                q=q->down;
            }
        }   
    }
    return number;
}
int main(){
    CrossList M;
    CreateCrossList(&M);
    printf("OK2\n");
    int num=NonzeroNumber(M);
    printf("OK3\n");
    printf("%d\n",num);
    return 0;
}

 

广义表:

#include<stdio.h>
#include<malloc.h>
typedef enum{
    ATOM,// ATOM=0:单元素;
    LIST// LIST=1:子表 
}ELemtag;
typedef struct GLNode{
    ELemtag tag;// 标志域,用于区分元素结点和表结点  
    union{      // 元素结点和表结点的联合部分 
        char atom; // atom 是原子结点的值域
        struct GLNode *hp; // 表结点的表头指针 
    };
    struct GLNode *tp; // 指向下一个结点  

}Node,*GList;
//计算广义表的深度
int GListDepth(GList L){ // 返回指针L所指的广义表的深度
    // 定义变量
    int dep;
    int max=0;
    GList pp;
    // 如果空表的深度 = 1
    // 原子的深度 = 0
    // 遍历广义表,求得深度
    for(pp=L; pp; pp=pp->tp){
        // 如果是链表,进入递归
        if(pp->tag==LIST){
            // 计算每一层hp指针数量
            dep = GListDepth(pp->hp)+1;
            // 统计回溯时hp指针的总数量
            if(dep>max){
                // 赋值
                max=dep;
            }
        }
        // 如果是原子,因为原子节点一定没有hp指针,所以直接进入下一循环
        if(pp->tag==ATOM){
            continue;
        }
    }
    return max;
}
int main(){
     如图可知有六个小结点,创建广义表
    GList p;
    GList list1=(GList)malloc(sizeof(Node));
    GList list2=(GList)malloc(sizeof(Node));
    GList list3=(GList)malloc(sizeof(Node));
    GList list4=(GList)malloc(sizeof(Node));
    GList list5=(GList)malloc(sizeof(Node));
    GList list6=(GList)malloc(sizeof(Node));
    p=list1;
    list1->tag=LIST;
    list1->tp=NULL;
    list1->hp=list2;
    list2->tag=ATOM;
    list2->tp=list3;
    list2->atom='a';
    list3->tag=LIST;
    list3->tp=NULL;
    list3->hp=list4;
    list4->tag=ATOM;
    list4->tp=list5;
    list4->atom='b';
    list5->tag=ATOM;
    list5->tp=list6;
    list5->atom='c';
    list6->tag=ATOM;
    list6->tp=NULL;
    list6->atom='d';
    int len=GListDepth(p);
    printf("%d\n",len);
    return 0;
}

 

标签:malloc,int,GList,链表,tag,广义,习题,sizeof,OLink
来源: https://blog.csdn.net/weixin_45823137/article/details/120660837