【线性结构之链式存储】广义表、多重链表与矩阵基础

广义表(Generalized List)

广义表是一种扩展的线性表,它的元素可以是单个数据元素,也可以是另一个广义表。这种结构具有递归性,可以用来表示非常复杂的数据结构,如树和图。

  • 定义:广义表是由零个或多个单元素或子表组成的有限序列。子表也可以是广义表。
  • 表示方法:通常使用圆括号来表示广义表,表内的元素用逗号分隔。例如,A = (a, (b, c), (d, (e, f))) 是一个广义表的例子,其中 A 包含三个元素:单元素 a,子表 (b, c),和子表 (d, (e, f))

多重链表(Multiply Linked List)

多重链表是一种链式存储结构,其中每个节点可以有多个指针域,指向其他节点。这种结构可以用来表示复杂的关系,如图。

  • 定义:在多重链表中,每个节点不仅包含数据域,还包含多个指针域,每个指针域可以指向其他节点。
  • 用途:多重链表常用于表示图、树等复杂的数据结构。

C语言实现示例

下面是一个简单的 C 语言实现,用于表示和操作广义表和多重链表。

广义表的实现
#include <stdio.h>
#include <stdlib.h>

typedef enum {ATOM, LIST} ElemTag;
typedef char AtomType;
typedef struct GLNode {
    ElemTag tag;
    union {
        AtomType atom;
        struct GLNode* hp;
    } unionData;
    struct GLNode* tp;
} GLNode, *GList;

GList CreateGList(char* str) {
    // 这里只是一个简化版的实现,用于演示
    // 实际上,创建广义表需要处理更多的细节,如递归解析字符串
}

void PrintGList(GList L) {
    // 打印广义表
}

void DeleteGList(GList L) {
    // 删除广义表
}

int main() {
    GList myList = CreateGList("(a, (b, c), (d, (e, f)))");
    PrintGList(myList);
    DeleteGList(myList);
    return 0;
}
多重链表的实现
#include <stdio.h>
#include <stdlib.h>

typedef struct Node {
    int data;
    struct Node* next[2];  // 这里只展示两个指针域,实际可以更多
} Node, *LinkedList;

LinkedList CreateLinkedList(int data) {
    LinkedList newNode = (LinkedList)malloc(sizeof(Node));
    newNode->data = data;
    newNode->next[0] = newNode->next[1] = NULL;
    return newNode;
}

void AddNode(LinkedList head, int data, int index) {
    // 在多重链表中添加节点
}

void PrintLinkedList(LinkedList head) {
    // 打印多重链表
}

void DeleteLinkedList(LinkedList head) {
    // 删除多重链表
}

int main() {
    LinkedList myList = CreateLinkedList(1);
    AddNode(myList, 2, 0);
    AddNode(myList, 3, 1);
    PrintLinkedList(myList);
    DeleteLinkedList(myList);
    return 0;
}

这些代码只是一个简单的示例,用于展示广义表和多重链表的基本结构。在实际应用中,这些数据结构的实现会更加复杂,需要处理更多的细节,如内存管理、错误处理等。

矩阵

什么是矩阵?

矩阵是一种数学概念,它是由数字或其他数学对象按照矩形阵列排列而成的。在计算机科学中,矩阵通常用于表示和解决各种问题,如线性方程组、图像处理等。

广义表和多重链表与矩阵的关系在于它们都可以用来表示矩阵。

广义表表示矩阵

广义表可以用来表示矩阵,其中每个元素可以是单个数据元素(如矩阵中的数字),也可以是另一个广义表(如矩阵中的行或列)。例如,一个 2x2 矩阵可以表示为:

复制

A = ((1, 2), (3, 4))

这里,A 是一个广义表,它包含两个子表 (1, 2) 和 (3, 4),每个子表表示矩阵的一行。

多重链表表示矩阵

多重链表也可以用来表示矩阵,其中每个节点包含矩阵中的一个元素,以及指向其相邻元素的指针。例如,一个 2x2 矩阵可以表示为一个多重链表,每个节点包含一个数据元素和指向其右侧和下方元素的指针。

C语言实现示例

下面是一个使用 C 语言实现的示例,展示了如何使用多重链表来表示和操作矩阵。

#include <stdio.h>
#include <stdlib.h>

typedef struct MatrixNode {
    int data;
    struct MatrixNode* right;
    struct MatrixNode* down;
} MatrixNode, *Matrix;

Matrix CreateMatrix(int rows, int cols) {
    Matrix head = (Matrix)malloc(sizeof(MatrixNode));
    Matrix temp = head;
    for (int i = 0; i < rows; i++) {
        Matrix newRow = (Matrix)malloc(sizeof(MatrixNode));
        temp->down = newRow;
        temp = newRow;
        for (int j = 0; j < cols; j++) {
            Matrix newNode = (Matrix)malloc(sizeof(MatrixNode));
            newNode->data = 0;  // 初始化为0
            newNode->right = NULL;
            newNode->down = NULL;
            temp->right = newNode;
            temp = newNode;
        }
    }
    return head;
}

void PrintMatrix(Matrix head, int rows, int cols) {
    // 打印矩阵
}

void DeleteMatrix(Matrix head, int rows, int cols) {
    // 删除矩阵
}

int main() {
    Matrix myMatrix = CreateMatrix(2, 2);
    PrintMatrix(myMatrix, 2, 2);
    DeleteMatrix(myMatrix, 2, 2);
    return 0;
}

在这个示例中,我们创建了一个 2x2 矩阵的多重链表表示。每个节点包含一个数据元素和指向其右侧和下方元素的指针。这个结构可以扩展到更大的矩阵,但需要注意内存管理和指针的正确设置。

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

七洛殇Atrosenet.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值