C语言实现线性动态(单向)链表的示例代码

下面是详细讲解“C语言实现线性动态(单向)链表的示例代码”的完整攻略:

线性动态(单向)链表是什么?

线性动态(单向)链表是一种动态数据结构,由若干个节点组成。每个节点包含两个部分:数据部分和一个称为指针的部分。指针指向下一个节点,最后一个节点指向空地址(NULL)。链表起始点称为头节点,最后一个节点称为尾节点。

实现步骤

1. 定义节点结构体

定义节点结构体,并包含数据和指向下一个节点的指针。示例代码如下:

typedef struct Node{
    int data; 
    struct Node *next;
} ListNode;

2.创建链表

创建链表需要分配头节点内存,将头节点指针指向空。示例代码如下:

ListNode *createList(){
    ListNode *head = (ListNode *)malloc(sizeof(ListNode));
    head->next = NULL;
    return head;
}

3.插入节点

插入节点需要找到要插入的位置,将新节点插入到该位置后面,然后修改相应节点的指针。示例代码如下:

void insert(ListNode *head, int data, int position) {
    ListNode *p = head;
    int i = 0;
    while (p != NULL && i < position - 1) {
        p = p->next;
        ++i;
    }
    if (p == NULL || i > position - 1) {
        printf("插入位置错误!\n");
        return;
    }

    ListNode *node = (ListNode *)malloc(sizeof(ListNode));
    node->data = data;
    node->next = p->next;
    p->next = node;
}

4.删除节点

删除节点操作需要找到要删除的节点,并修改相邻节点的指针。示例代码如下:

void delete(ListNode *head, int position) {
    ListNode *p = head;
    int i = 0;
    while (p != NULL && i < position - 1) {
        p = p->next;
        ++i;
    }
    if (p == NULL || p->next == NULL || i > position - 1) {
        printf("删除位置错误!\n");
        return;
    }

    ListNode *del = p->next;
    p->next = del->next;
    free(del);
}

5.遍历链表

遍历链表就是依次访问每个节点,并输出节点的数据。示例代码如下:

void traverseList(ListNode *head) {
    ListNode *p = head->next;
    while (p != NULL) {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n");
}

6.销毁链表

销毁链表需要释放链表的每个节点的内存空间,最后释放头节点的内存空间。示例代码如下:

void freeList(ListNode *head) {
    ListNode *p = head;
    while (p != NULL) {
        ListNode *tmp = p;
        p = p->next;
        free(tmp);
    }
}

示例说明

示例1

在控制台终端下,通过调用以上定义的函数,实现链表节点的插入与删除,并通过遍历链表输出链表的每个节点的数据。示例代码如下:

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

int main() {
    ListNode *head = createList();

    insert(head, 10, 1);
    insert(head, 20, 2);
    insert(head, 30, 3);

    traverseList(head);

    delete(head, 2);

    traverseList(head);

    freeList(head);

    return 0;
}

示例2

在控制台终端下,通过读入文件来创建链表,之后对链表进行操作。示例代码如下:

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

int main() {
    ListNode *head = createList();

    FILE *fp = fopen("data.txt", "r+");
    if (fp == NULL) {
        printf("Failed to open data file.");
        exit(0);
    }

    int data, pos;
    char op;
    while (fscanf(fp, "%c,%d,%d\n", &op, &pos, &data) != EOF) {
        if (op == 'I') {
            insert(head, data, pos);
        } else if (op == 'D') {
            delete(head, pos);
        }
    }

    fclose(fp);

    traverseList(head);

    freeList(head);

    return 0;
}

以上就是“C语言实现线性动态(单向)链表的示例代码”的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言实现线性动态(单向)链表的示例代码 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • TPLINK XTR5466内置天线款路由器怎么样? xtr5466c拆解评测

    TPLINK XTR5466内置天线款路由器评测攻略 1. 设备介绍 TPLINK XTR5466是一款内置天线的路由器,采用4×4 MU-MIMO技术,可以同时支持多台设备的数据传输。拥有5个千兆以太网口、1个USB 3.0接口、1个USB 2.0接口,适用于家庭或办公室等小型网络环境。 2. 性能测试 2.1 信号覆盖范围测试 采用普通笔记本电脑连接,分…

    C 2023年5月23日
    00
  • C语言写一个散列表

    C语言写一个散列表的完整攻略 什么是散列表? 散列表是一种数据结构,它将键映射到值。通过使用散列函数,散列表可以快速查找数据。散列表可以用于实现字典、哈希表、集合等数据结构。 散列表的实现 散列表的实现可以分为以下几步: 定义散列表的结构体以及散列表元素的结构体; 实现散列函数; 实现插入元素方法; 实现查找元素方法; 实现删除元素方法; 实现销毁散列表方法…

    C 2023年5月23日
    00
  • C程序 查找数组中常见元素

    下面是查找数组中常见元素的使用攻略: 1. 程序介绍 本程序的功能是,在一个给定的整型数组中,查找出出现次数最多的若干个元素。 2. 环境要求 本程序使用 C 语言编写,需要在计算机上安装 C 编译器才能运行。常用的 C 编译器有 GCC、Clang、Visual Studio 等。此外,程序需要在控制台(命令行)下运行。 3. 程序结构 程序的主要流程分为…

    C 2023年5月9日
    00
  • c语言中static修饰函数的方法及代码

    当在 C 语言中使用 static 关键字修饰函数时,这个函数被指定为“静态函数”。静态函数与普通函数有些不同。静态函数的作用域仅限于所在的源文件。这意味着它只能被同一源文件中的其他函数调用,在其他源文件中是不可见的。以下是关于如何使用 static 关键字修饰函数的方法及示例说明: 1. 静态函数的定义 静态函数只能在当前源文件中使用,它的作用域被限制在当…

    C 2023年5月24日
    00
  • Javascript技术难点之apply,call与this之间的衔接

    JavaScript中的this是编写JavaScript代码时最容易出错的概念之一。它不是指向函数本身,而是指向函数被调用时的当前对象。本文将讨论JavaScript中this的实现方式,以及用JavaScript中的apply和call方法来准确处理this的使用。 基本概念 this:一个特殊的关键字,指向正在执行的函数在哪个对象中被调用; apply…

    C 2023年5月23日
    00
  • 基于C语言实现简单的扫雷游戏

    基于C语言实现简单的扫雷游戏攻略 需求分析 在实现扫雷游戏之前,我们需要明确游戏的需求和规则。扫雷游戏的规则大致如下:1. 游戏界面由一个矩形格子组成,每个格子可以是地雷或数字或空白。2. 游戏开始时,所有格子都是未翻开的状态。3. 玩家通过点击格子来翻开它们。当翻开的格子是空白时,它周围的8个格子也会被翻开。当翻开的格子是数字时,为周围8个格子中地雷的数量…

    C 2023年5月23日
    00
  • 《程序员的自我修养》学习笔记——揭秘源文件到可执行文件的编译过程【第一弹】

    程序代码到可执行程序编译链接过程 预编译 以c++/c 语言为例,预编译阶段的工作有以下几点: 处理所有#define 及条件预编译指令(如 #if,#ifdef…..),并展开所有宏定义。 删除所有注释(“//” ,”/**/”)。 处理 “#include”,将被包含文件插入该预编译指令位置。(整过过程递归进行,因为被包含文件也可能包含其他文件) 添…

    C语言 2023年4月18日
    00
  • C++学习之算术运算符使用详解

    C++学习之算术运算符使用详解 在C++语言中,算术运算符是一组用于执行算术运算(如加减乘除)的运算符。在本篇文章中,我们将进行深入的讨论和示范 C++ 中常用的算术运算符。本文主要包括以下内容: 算术运算符概述 算术运算符优先级 算术运算符使用示例 算术运算符概述 C++ 中的算术运算符如下表所示: 运算符 描述 + 加法 – 减法 * 乘法 / 除法 %…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部