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日

相关文章

  • C语言实现学生信息管理程序

    让我来详细讲解“C语言实现学生信息管理程序”的攻略。 概述 学生信息管理程序是一个非常基础的程序,它主要实现如下功能: 添加学生信息 查询学生信息 修改学生信息 删除学生信息 开发学生信息管理程序可以加强我们对C语言基础知识的掌握,例如指针、结构体等等。 开发步骤 1. 创建学生信息结构体 首先,我们需要创建一个结构体来存储学生信息。结构体可以包含学生的姓名…

    C 2023年5月22日
    00
  • C++实现扫雷小游戏(控制台版)

    以下是“C++实现扫雷小游戏(控制台版)”的完整攻略: 1. 确定游戏规则 在实现扫雷游戏前,需要确定游戏的具体规则,包括雷区大小、雷数、标记雷的方式以及游戏胜利条件等。通常一个雷区是由若干个格子组成,每个格子可能包含地雷,也可能不包含地雷,游戏胜利条件可以是找到所有没有地雷的格子,或者是正确标记了所有地雷的位置。 2. 编写程序 在明确游戏规则后,可以开始…

    C 2023年5月23日
    00
  • python Yaml、Json、Dict之间的转化

    现在我们来详细讲解Python中Yaml、Json和Dict之间的相互转化。 Yaml、Json和Dict的介绍 Yaml是一种轻量级的用于描述数据序列化的格式,读起来比较易懂,常用于配置文件和数据交换格式。 Json是JavaScript对象表示法,是另一种数据交换格式,通常用于Web应用程序。 Dict是Python中的一种内置数据类型,表示键值对之间的…

    C 2023年5月23日
    00
  • Win8系统下运行TurboC软件具体方法(图文)

    以下是详细讲解Win8系统下运行TurboC软件具体方法的完整攻略: 1. 确定TurboC软件版本 首先需要确定TurboC软件的版本,因为不同版本的TurboC安装方法略有不同。例如:TurboC++ 3.0需要使用DOSBox来运行,而TurboC++ 4.5可以直接在Windows下运行。在确定软件版本后,可以相应地选择合适的安装方法。 2. 下载T…

    C 2023年5月23日
    00
  • 详解C++编程中的变量相关知识

    详解C++编程中的变量相关知识 C++变量的定义 在C++中定义变量需要指定变量类型和变量名,语法如下: <type> <identifier> [=<initializer>]; <type>:变量类型,如int、char、float、double等。 <identifier>:变量名,由字母、数…

    C 2023年5月23日
    00
  • 12个C语言必背实例分享

    12个C语言必背实例攻略 本文将分享12个C语言必背实例,涉及到的知识点从基础的数据类型、数组、结构体到文件操作等。以下是每个实例的说明及代码示例。 1. 输入输出 实例说明 通过 scanf 函数输入三个数,再通过 printf 函数输出这三个数的和 代码示例 #include <stdio.h> int main() { int a,b,c,…

    C 2023年5月23日
    00
  • OpenCV mask的作用及如何制作掩模mask

    OpenCV的mask是一个二进制图像,用于控制对另一个图像的操作。在图像处理中,掩模通常被用于选择感兴趣区域(ROI)或执行像素级别的操作,如图像增强、滤波、混合等。 制作掩模实际上就是创建一个二值图像,其中像素值为0或255(黑或白),作用是将掩模图像中为255的像素区域与原图像中对应位置的像素进行操作,在区域内进行所需的图像处理操作。 下面我们以制作掩…

    C 2023年5月23日
    00
  • 浅谈C++的几种从键盘输入方式

    浅谈C++的几种从键盘输入方式 在C++中,从键盘获取用户输入是很常见的操作。本文将介绍几种常用的获取输入的方式。 1. cin cin是iostream库提供的标准输入流对象,它支持多种数据类型的输入。使用cin获取用户输入的方法是使用>>运算符。以下是一个简单的示例代码: #include <iostream> using nam…

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