C语言静态链表和动态链表

yizhihongxing

C语言中实现链表有两种方式,静态链表和动态链表。下面我们对这两种链表进行详细介绍。

静态链表

静态链表是指使用数组来模拟链表。因为在定义时,数组大小必须确定,所以静态链表的长度是固定的。静态链表需要手动维护指针,即每个元素除了存储自己的值外,还需要记录下一个元素的下标。静态链表使用起来比较繁琐,但是相对于动态链表,它更加节省空间,不需要频繁地进行内存动态分配。下面是一个静态链表的示例代码:

#define MAXSIZE 100
typedef struct {
    int data;
    int next;   // 存储下一个元素的下标
} Node;

Node staticList[MAXSIZE];

// 初始化静态链表,返回头结点的下标
int initStaticList() {
    for (int i = 0; i < MAXSIZE - 1; i++) {
        staticList[i].next = i + 1;
    }
    staticList[MAXSIZE - 1].next = -1;  // 表示链表的结尾
    return 0;   // 返回头结点
}

// 在静态链表的指定位置插入一个元素
void insertStaticList(int pos, int value) {
    int cursor = MAXSIZE - 1;   // 游标从头结点开始
    for (int i = 0; i < pos - 1; i++) {
        cursor = staticList[cursor].next;   // 移动游标
    }
    int new_node = staticList[cursor].next;   // 获取下一个元素的下标
    staticList[new_node].data = value;
    staticList[cursor].next = new_node;   // 修改当前元素的“下一个元素”
}

// 遍历静态链表
void traverseStaticList() {
    int cursor = staticList[0].next;   // 从头结点的下一个元素开始遍历
    while (cursor != -1) {
        printf("%d ", staticList[cursor].data);
        cursor = staticList[cursor].next;   // 移动游标
    }
}

动态链表

动态链表是指使用指针来实现链表,链表的长度不固定,可以根据需要动态分配内存。相对于静态链表,动态链表的使用起来更加方便灵活,但是需要注意内存泄漏问题。下面是一个动态链表的示例代码:

typedef struct Node {
    int data;
    struct Node *next;   // 指向下一个元素的指针
} Node, *LinkList;

// 初始化动态链表,返回头结点的指针
LinkList initLinkList() {
    Node *head = (Node*)malloc(sizeof(Node));   // 创建头结点
    head->next = NULL;
    return head;   // 返回头结点指针
}

// 在动态链表的指定位置插入一个元素
void insertLinkList(LinkList L, int pos, int value) {
    Node *cursor = L;
    for (int i = 0; i < pos - 1; i++) {
        if (cursor->next == NULL) {   // 判断是否到达链表的结尾
            printf("Error: Index out of range\n");
            return;
        }
        cursor = cursor->next;   // 移动游标
    }
    Node *new_node = (Node*)malloc(sizeof(Node));   // 创建新结点
    new_node->data = value;
    new_node->next = cursor->next;   // 修改新结点的“下一个元素”
    cursor->next = new_node;   // 修改当前结点的“下一个元素”
}

// 遍历动态链表
void traverseLinkList(LinkList L) {
    Node *cursor = L->next;   // 从头结点的下一个元素开始遍历
    while (cursor != NULL) {
        printf("%d ", cursor->data);
        cursor = cursor->next;   // 移动游标
    }
}

以上就是静态链表和动态链表的完整攻略,希望能对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言静态链表和动态链表 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • Android自定义悬浮按钮效果

    Android自定义悬浮按钮效果 在手机应用开发中,悬浮按钮已经成为了流行的用户界面元素。悬浮按钮可以通过相应的手势实现一些应用操作,比如向上滑动打开应用菜单、向下滑动隐藏悬浮按钮等等。本文将介绍如何使用Android SDK来自定义悬浮按钮效果。 步骤1:创建悬浮按钮控件 为了实现悬浮按钮的效果,需要创建自定义的View控件。下面是一个简单的悬浮按钮控件代…

    other 2023年6月25日
    00
  • oracle删除表语句

    当然,我很乐意为您提供有关“Oracle删除表语句”的完整攻略。以下是详细的步骤和两个示例: 1 删除表 在Oracle中,可以使用DROP TABLE语句删除表。DROP TABLE语句将删除指定的表及其所有相关的对象,如索引、触发器、约束等。 2 示例 以下是两个删除表的示例: 2.1 删除单个表 要删除单个表,可以使用以下语法: DROP TABLE …

    other 2023年5月6日
    00
  • Mysql InnoDB 的内存结构详情

    Mysql InnoDB 的内存结构详情攻略 MySQL InnoDB 是一种常用的关系型数据库管理系统,它使用了一种称为 InnoDB 存储引擎的技术来管理数据。InnoDB 存储引擎使用了一套复杂的内存结构来提高性能和数据的一致性。下面是关于 InnoDB 内存结构的详细攻略。 1. 缓冲池(Buffer Pool) 缓冲池是 InnoDB 存储引擎最重…

    other 2023年8月2日
    00
  • 6.(转载)SSRF漏洞挖掘经验

    6. (转载) SSRF漏洞挖掘经验 本文将分享一些SSRF漏洞挖掘的经验和技巧。SSRF漏洞是一种在Web应用中广泛存在的安全漏洞,攻击者可以利用它来发起内网扫描、攻击内部系统等。 什么是SSRF漏洞? SSRF全称Server-Side Request Forgery(服务端请求伪造)漏洞,简单来说,就是Web应用程序中的一个安全漏洞,攻击者可以利用它来…

    其他 2023年3月28日
    00
  • 鼠标快捷手势设置方法实现鼠标手势来执行任务

    下面是“鼠标快捷手势设置方法实现鼠标手势来执行任务”的完整攻略: 一、安装鼠标手势软件 首先,我们需要安装一个鼠标手势软件。推荐使用 StrokesPlus 这款免费的开源软件。 访问 StrokesPlus 官网,在首页的”Download”页面下载适用于您的 Windows 版本的安装程序 执行下载的安装程序,按照提示安装 StrokesPlus 软件。…

    other 2023年6月27日
    00
  • Python中模块与包有相同名字的处理方法

    在Python中,如果模块和包具有相同的名称,可以使用以下方法进行处理: 使用绝对导入:可以使用完整的包路径来导入模块,以避免名称冲突。例如,如果有一个名为module的模块和一个名为package的包,可以使用以下方式导入模块: from package import module 这样可以明确指定要导入的是包中的模块,而不是当前目录下的同名模块。 使用相…

    other 2023年9月7日
    00
  • offsetparent的解释

    以下是详细讲解“offsetParent的解释的完整攻略”的标准Markdown格式文本: offsetParent的解释的完整攻略 offsetParent是一个DOM属性,用于获取一个元素的最近的定位(position属性值为relative、absolute、fixed)祖先元素。本文将介绍offsetParent的基本概念、使用方法和两个示例说明。 …

    other 2023年5月10日
    00
  • C++统计中英文大小写字母、数字、空格及其他字符个数的方法

    C++统计中英文大小写字母、数字、空格及其他字符个数的方法 以下是一种用C++编写的统计中英文大小写字母、数字、空格及其他字符个数的方法的完整攻略。 步骤1:包含必要的头文件 首先,我们需要包含 <iostream> 和 <cctype> 头文件,以便使用C++的输入输出功能和字符处理函数。 #include <iostream…

    other 2023年8月18日
    00
合作推广
合作推广
分享本页
返回顶部