IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 链表和广义表的习题 -> 正文阅读

[数据结构与算法]链表和广义表的习题

答案:

// 总的代码,包括存储结构、初始化创建、输出个数
#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;
}

?

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-10-09 16:31:37  更:2021-10-09 16:34:04 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/17 14:44:26-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码