icoding复习4 数组 十字链表

icoding 复习4  

1. 矩阵加法
实现三元组表示的两个稀疏矩阵的加法。
#define MAXSIZE 100          //假设非零元个数的最大值为100
typedef struct {
    int i,j;                //非零元的行下标和列下标,i 和 j 从 1 开始计数,与数学中矩阵元素的编号一致
    ElemType e;                //非零元的值
}Triple;
typedef struct {
    Triple data[MAXSIZE];    // 非零元三元组表
    int    m, n, len;        // 矩阵的行数、列数和非零元个数
}TSMatrix;
pM, pN, pQ 分别指向三个矩阵,当 pM 和 pN 两个矩阵不可加时,函数返回 false,
否则函数返回 true,且 pQ 指向两个矩阵的和。


#include "tsmatrix.h"
#include
#include

bool add_matrix(const TSMatrix* pM, const TSMatrix* pN, TSMatrix* pQ)
{
    if(pM->m != pN->m || pM->n != pN->n) return false;
    
    pQ->m = pM->m;
    pQ->n = pM->n;
    //记得检查结构体赋值!! 
    int i, j, k = 0;
    for(i = 0, j = 0; i < pM->len && j < pN->len;){
        if(pM->data[i].i == pN->data[j].i){
            if(pM->data[i].j == pN->data[j].j){
                if(pM->data[i].e + pN->data[j].e){
                    pQ->data[k].e = pM->data[i].e + pN->data[j].e;
                    pQ->data[k].i = pM->data[i].i;
                    pQ->data[k].j = pM->data[i].j;
                    k++; i++; j++;
                }
                else{//这个else可以不要,前面的if里面的i++和j++可以提出来 
                    i++; j++;
                }
            }
            else if(pM->data[i].j < pN->data[j].j){
                pQ->data[k].e = pM->data[i].e;
                pQ->data[k].i = pM->data[i].i;
                pQ->data[k].j = pM->data[i].j;
                k++; i++;
            }
            else{
                pQ->data[k].e = pN->data[j].e;
                pQ->data[k].i = pN->data[j].i;
                pQ->data[k].j = pN->data[j].j;
                k++; j++;
            }
        }
        else if(pM->data[i].i < pN->data[j].i){
            pQ->data[k].e = pM->data[i].e;
            pQ->data[k].i = pM->data[i].i;
            pQ->data[k].j = pM->data[i].j;
            k++; i++;
        }
        else{
            pQ->data[k].e = pN->data[j].e;
            pQ->data[k].i = pN->data[j].i;
            pQ->data[k].j = pN->data[j].j;
            k++; j++;            
        }    
    } 
    while(i < pM->len){
        pQ->data[k].e = pM->data[i].e;
        pQ->data[k].i = pM->data[i].i;
        pQ->data[k].j = pM->data[i].j;
        k++; i++;        
    }
    while(j < pN->len){
        pQ->data[k].e = pN->data[j].e;
        pQ->data[k].i = pN->data[j].i;
        pQ->data[k].j = pN->data[j].j;
        k++; j++;        
    }
    pQ->len = k;
    return true;
}

2. 十字链表

typedef int ElemType;
// 非零元素结点结构
typedef struct OLNode
{
    int row,col;
    ElemType value;
    struct OLNode *right,*down;
}OLNode,*OLink;
// 十字链表结构
typedef struct
{
    OLink *rowhead,*colhead;
    int rows,cols,nums;
}CrossList, *PCrossList;

1)实现十字链表的初始化操作:
int init_cross_list(PCrossList L, const ElemType *A, int m, int n);
其中 L 指向 CrossList 结构,且各成员已被初始化为0;
A 为 ElemType 类型  数组中第一个元素的地址,元素的个数为 m×n 个,按行优先存储
(即A[0] 为十字链表第1行第1列的元素;
A[1] 为第1行第2列的元素,A[n] 为第2行第1列的元素,A[n+1] 为第2行第2个元素);

m 表示十字链表的行数,n 表示十字链表的列数。
init_cross_list 函数将 ElemType 数组中非0元素保存到十字链表中,函数返回非 0 元素的个数。

2)实现十字链表的删除操作:
int del_cross_list(PCrossList L, ElemType k);
其中 L 指向 要处理的 CrossList 结构,k 为要删除的元素;
del_cross_list 函数删除十字链表中所有值为 k 的结点,并返回删除结点的个数。


掌握!!!!!! 
int init_cross_list(PCrossList L, const ElemType* A, int m, int n)
{
    int i, j, k = 0;
    OLNode *p, *q;

    L->cols = n;
    L->rows = m;
    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    //下面这个是个很奇怪的数组可以认为是指针数组 
    if (!(L->rowhead = (OLink*)malloc(m * sizeof(OLink))))//也可以return 0;....icoding不会检测..... 
        ;
    if (!(L->colhead = (OLink*)malloc(n * sizeof(OLink))))
        ;

    for (i = 0; i < m; i++)
        L->rowhead[i] = NULL;

    for (i = 0; i < n; i++)
        L->colhead[i] = NULL;

    for (i = 0; i < m; i++) {
        for (j = 0; j < n; j++) {
            if (A[i * n + j] != 0) {
                k++;
                if (!(p = (OLNode*)malloc(sizeof(OLNode))))
                    ;
                p->col = j;
                p->row = i;
                p->value = A[i * n + j];
                //!!!
                if (L->rowhead[i] == NULL || L->rowhead[i]->col > j) {
                    p->right = L->rowhead[i]; //头插法
                    L->rowhead[i] = p;
                } else {
                    q = L->rowhead[i];
                    while (q->right && q->right->col < j)
                        q = q->right;
                    p->right = q->right;
                    q->right = p;
                }
                
                if (L->colhead[j] == NULL || L->colhead[j]->row > i) {
                    p->down = L->colhead[j];
                    L->colhead[j] = p;
                } else {
                    q = L->colhead[j];
                    while (q->down && q->down->row < i)
                        q = q->down;
                    p->down = q->down;
                    q->down = p;
                }
            }
        }
    }
    L->nums = k;
    return L->nums;
} //init


int del_cross_list(PCrossList L, ElemType k)
{
    int num = 0;
    int i, j;
    OLNode *p, *q, *s;
    OLNode *x, *y, *z;

    for (i = 0; i < L->rows; i++) {
        p = L->rowhead[i];
        q = p;
        while (p) {
            if (p->value == k && p == q) {//第一个结点(不设头结点) 
                L->rowhead[i] = L->rowhead[i]->right;
                free(p);
                p = L->rowhead[i];
                num++;
            } else if (p->value == k) {
                s = p;
                q->right = p->right;
                free(p);
                p = q->right;
                num++;
            } else {
                q = p;
                p = p->right;
            }
        }
    }
    //下面的for可以不要,icoding根本不得检测纵向的链.......................................................... 
    for (j = 0; j < L->cols; j++) {
        x = L->colhead[j];
        y = x;
        while (x) {
            if (x->value == k && x == y) {
                L->colhead[j] = L->colhead[j]->down;
                x = x->down;
                free(y);
            } else if (x->value == k) {
                y->down = x->down;
                z = x;
                free(z);
            } else {
                y = x;
                x = x->down;
            }
        }
    }

    L->nums -= num;
    return num;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/311458.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【译】来看看WebWindow,一个跨平台的.NET Core webview 库

本文翻译自 ASP.NET 项目组的 Steve Sanderson 的博客&#xff0c;发表于 2019 年 11 月 18 日。Steve Sanderson 是 Blazor 最早的创造者。它类似于 Electron&#xff0c;但没有捆绑 Node.js 和 Chromium&#xff0c;也没有大部分 API。我的上一篇文章研究了如何用 web 渲染的…

sql if 和insert_拼多多面试:Mybatis是如何实现SQL语句复用功能的?

在工作中&#xff0c;往往有这样的需求&#xff0c;对于同一个sql条件查询&#xff0c;首先需要统计记录条数&#xff0c;用以计算pageCount&#xff0c;然后再对结果进行分页查询显示&#xff0c;看下面一个例子。<sql id"studentProperties"><!--sql片段-…

上元节的灯会(亮)-dfs

题目背景 上元佳节&#xff0c;庙会里举办着各式各样的庆典活动&#xff0c;牛宝也兴奋地参与其中。突然&#xff0c;他被一个新颖的点灯游戏所吸引&#xff0c;游戏要求最终点亮所有在场的花灯&#xff0c;每盏灯都有开关两种状态&#xff0c;每一次点击在场的一盏任意状态的花…

代码演示C#各版本新功能

代码演示C#各版本新功能C#各版本新功能其实都能在官网搜到&#xff0c;但很少有人整理在一起&#xff0c;并通过非常简短的代码将每个新特性演示出来。代码演示C#各版本新功能C# 2.0版 - 2005泛型分部类型匿名方法可以为null的值类型迭代器协变和逆变C# 3.0版 - 2007自动实现的…

icoding复习5 树 感觉难度巨大....

icoding 复习5 1. 先序遍历 已知二叉树按照二叉链表方式存储&#xff0c;利用栈的基本操作写出先序遍历非递归形式的算法&#xff1a; void pre_order(BiTree root); 二叉树的相关定义如下&#xff1a; typedef int DataType; typedef struct Node{ DataType data; …

python 进行一元线性回归并输出相关结果_Python实现一元线性回归实战

回归是一种有监督的学习方式&#xff0c;需要根据历史数据对未知数据做出预测。在此&#xff0c;以房屋面积预测房屋价格为例&#xff1a;首先&#xff0c;读入数据&#xff1a;代码如下&#xff1a;import pandas as pdimport numpy as npfrom io import StringIOfrom sklearn…

《C++ Primer》第一章的 Sales_item.h头文件源码

Sales_item.h不是C自带的&#xff0c;需要自己安装&#xff0c;这个库作者已经写好了, Sales_item.h 头文件代码如下&#xff1a; #ifndef SALESITEM_H #define SALESITEM_H #include <iostream> #include <string>class Sales_item{ public:Sales_item(const std…

icoding复习7, 8

icoding复习7 哈希,AVL 查找 必考点!!! 1. 哈希表创建 typedef enum{ HASH_OK, HASH_ERROR, HASH_ADDED, HASH_REPLACED_VALUE, HASH_ALREADY_ADDED, HASH_DELETED, HASH_NOT_FOUND, } HASH_RESULT; typedef struct __HashEntry HashEntry; struc…

python加载模型包占用内存多大_加载pickle python对象会占用大量内存

我有一个python的pickle对象,它生成一个180 Mb的文件.当我取消它时,内存使用量会爆炸到2或3Gb.你有类似的经历吗&#xff1f;这是正常的吗&#xff1f;对象是包含字典的树&#xff1a;每个边是一个字母,每个节点都是一个潜在的单词.因此,要存储一个单词,您需要的边数与该单词的…

《C++ Primer》1.52节练习

练习1.23 #include <iostream> #include "Sales_item.h"using namespace std;int main() {Sales_item trans1, trans2;cout << "请输入若干销售记录:" << endl;if (cin >> trans1) {int num 1;while (cin >> trans2)if (t…

ASP.NET Core 反向代理部署知多少

引言最近在折腾统一认证中心&#xff0c;看到开源项目[IdentityServer4.Admin&#xff1a;https://github.com/skoruba/IdentityServer4.Admin]集成了IdentityServer4和管理面板&#xff0c;就直接拿过来用了。在尝试Nginx部署时遇到了诸如虚拟目录映射&#xff0c;请求头超长、…

函数传参string_JavaScript 高阶函数入门浅析

原文&#xff1a;https://www.freecodecamp.org/news/a-quick-intro-to-higher-order-functions-in-javascript-1a014f89c6b/译者&#xff1a;jingruzhang校对者&#xff1a;acusp高阶函数高阶函数可以接收函数作为参数&#xff0c;同时也可以返回一个新的函数。高阶函数之所以…

all()与any()

all():当可迭代对象为空时返回True。或者当可迭代对象中是否所有值都为True&#xff0c;所有值都为True,则返回True。否则返回False。any():当可迭代对象为空时返回False。或者当可迭代对象中是否存在一个为True的值&#xff0c;若存在&#xff0c;返回True,否则返回False 示例…

.NET Core开发实战(第13课:配置绑定:使用强类型对象承载配置数据)--学习笔记...

13 | 配置绑定&#xff1a;使用强类型对象承载配置数据要点&#xff1a;1、支持将配置值绑定到已有对象2、支持将配置值绑定到私有属性上继续使用上一节代码首先定义一个类作为接收配置的实例class Config {public string Key1 { get; set; }public bool Key5 { get; set; }pub…

Python--第3次平时作业

目录 一、单项选择题 二、程序填空题 三、所有测试代码如下: 一、单项选择题 题号 1 2 3 4 5 6 7 8 9 10 答案 C A A C C D D D D C 题号 11 12 13 14 15 16 17 18 19 20 答案 A A C C B C A C B A 题号 21 22 23 24 25 …

工业互联网白皮书_发布|《工业互联网平台安全白皮书(2020)》发布

12月4日&#xff0c;2020年中国工业信息安全大会暨全国工控安全深度行(京津冀站)在北京国际会议中心举行。大会由国家工业信息安全发展研究中心、工业信息安全产业发展联盟主办&#xff0c;以“贯彻总体国家安全观&#xff0c;把牢工控安全基准线”为主题。会上&#xff0c;国家…

UVA - 514 Rails-栈

某城市有一个火车站&#xff0c;铁轨铺设如图6-1所示。 有n节车厢从A方向驶入车站&#xff0c;按进站顺 序编号为1&#xff5e;n。 你的任务是判断是否能让它们按照某种特定的顺序进入B方向的铁轨并驶出 车站。 例如&#xff0c;出栈顺序(5 4 1 2 3)是不可能的&#xff0c;但(5…

全局思维

在这个复杂多变的时代&#xff0c;是时候提升我们的思维了&#xff0c;树立大局意识&#xff0c;在把握空间纵轴线和时间水平线中思考和谋划大局。全局思维能力&#xff0c;蕴含着从全局的、长远的、战略的高度来分析问题和解决问题的能力&#xff1b;是善于从大处着眼、小处着…

python中函数的参数类型( 位置参数、关键字参数、默认值参数和可变长度参数)

目录 位置参数: 关键字参数: 默认值参数: 可变长度参数: 1.元组可变长度参数 : 2.字典可变长度参数: 附上练习代码: 位置参数: 实参与形参个数完全相同,按位置按顺序将实参传递给形参 def f(x, y):print(x, y) f(2, 3) 2, 3 关键字参数: 在函数调用中使用关键字参数&…