C语言实现动态链表的示例代码

让我们来讲解C语言实现动态链表的示例代码的完整攻略。

1. 概述

动态链表是指链表在运行时动态地申请内存空间,可以根据需要自由地进行插入和删除操作。相对于静态链表,动态链表具有更大的灵活性和扩展性。

在C语言中,动态链表可以通过结构体指针实现。本文介绍了一个简单的C语言实现动态链表的示例代码。

2. 定义链表结构体

首先,我们需要定义链表的结构体,包括数据和指向下一个结点的指针。

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

3. 创建链表

创建链表的时候,我们需要动态申请内存空间。

Node* createList(int num) {
    Node *head = (Node *)malloc(sizeof(Node));
    head->next = NULL;
    Node *p = head;
    int i;
    for(i = 0; i < num; i++) {
        Node *temp = (Node *)malloc(sizeof(Node));
        temp->data = i;
        temp->next = NULL;
        p->next = temp;
        p = p->next;
    }
    return head;
}

在这段代码中,我们首先申请一个头结点的内存空间,然后创建一个指针p指向头结点。接下来,我们循环num次,每次申请一个存储数据的结点,并将数据赋值为i。然后将新结点连接到链表尾部,更新p指针到链表尾部。

4. 插入结点

在动态链表中,插入结点的过程比较简单。我们只需要先申请一个新的结点内存空间,然后将新结点连接到链表中即可。

void insertNode(Node *head, int data) {
    Node *p = head;
    while(p->next != NULL) {
        p = p->next;
    }
    Node *newNode = (Node *)malloc(sizeof(Node));
    newNode->data = data;
    newNode->next = NULL;
    p->next = newNode;
}

在这段代码中,我们首先遍历链表找到链表的尾结点,然后申请一个新结点内存空间。将新结点与链表连接即可。

5. 删除结点

删除链表结点的步骤也比较简单。我们只需要遍历链表找到待删除结点的前一个结点,然后修改指针即可。

void deleteNode(Node *head, int data) {
    Node *p = head;
    while(p->next != NULL && p->next->data != data) {
        p = p->next;
    }
    if(p->next != NULL) {
        Node *temp = p->next;
        p->next = temp->next;
        free(temp);
    }
}

在这段代码中,我们首先遍历链表找到待删除结点的前一个结点。然后将待删除结点从链表中删除,释放内存空间。

6. 示例说明

示例1

假设我们要创建一个包含5个结点的链表,并对链表进行遍历输出。

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

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

Node* createList(int num) {
    Node *head = (Node *)malloc(sizeof(Node));
    head->next = NULL;
    Node *p = head;
    int i;
    for(i = 0; i < num; i++) {
        Node *temp = (Node *)malloc(sizeof(Node));
        temp->data = i;
        temp->next = NULL;
        p->next = temp;
        p = p->next;
    }
    return head;
}

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

int main() {
    Node *head = createList(5);
    printList(head);
    return 0;
}

输出结果为:

0 1 2 3 4 

示例2

假设我们有一个包含6个结点的链表,现在要向链表中插入一个结点,数据值为6。

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

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

void insertNode(Node *head, int data) {
    Node *p = head;
    while(p->next != NULL) {
        p = p->next;
    }
    Node *newNode = (Node *)malloc(sizeof(Node));
    newNode->data = data;
    newNode->next = NULL;
    p->next = newNode;
}

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

int main() {
    Node *head = (Node *)malloc(sizeof(Node));
    head->next = NULL;
    Node *p = head;
    int i;
    for(i = 0; i < 6; i++) {
        Node *temp = (Node *)malloc(sizeof(Node));
        temp->data = i;
        temp->next = NULL;
        p->next = temp;
        p = p->next;
    }
    insertNode(head, 6);
    printList(head);
    return 0;
}

输出结果为:

0 1 2 3 4 5 6 

以上就是C语言实现动态链表的示例代码的完整攻略。

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

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

相关文章

  • android studio实现简单考试应用程序实例代码详解

    下面是“android studio实现简单考试应用程序实例代码详解”的完整攻略。 简介 本文将介绍如何使用Android Studio制作一个简单的考试应用程序,包括设计界面、编写代码以及实现基本的功能,旨在帮助初学者了解Android Studio的基本操作和思维过程。本文的代码示例将包括两个部分: 显示考试题目和选项。 检查答案并计分。 设计界面 首先…

    other 2023年6月25日
    00
  • Golang如何交叉编译各个平台的二进制文件详解

    Golang是一门跨平台的编程语言,支持Linux、MacOS和Windows等多个操作系统,为了方便用户在不同平台上使用,Golang提供了交叉编译功能,可以在一台机器上编译出不同平台的二进制文件。 以下是Golang交叉编译各个平台的二进制文件的具体步骤: 1. 确定操作系统和CPU架构 在交叉编译之前,需要先确定要编译的目标操作系统和CPU架构,Gol…

    other 2023年6月26日
    00
  • Nginx和PHP-FPM的启动、重启、停止脚本分享

    下面是关于Nginx和PHP-FPM的启动、重启、停止脚本的完整攻略。 1. Nginx启动、重启、停止脚本 1.1. Nginx启动脚本 在Linux系统中,启动Nginx可以通过以下命令来执行: sudo systemctl start nginx 如果你想在系统启动的时候自动启动Nginx,可以使用以下命令: sudo systemctl enable…

    other 2023年6月27日
    00
  • Android音视频开发Media FrameWork框架源码解析

    一、Android音视频开发Media FrameWork框架源码解析 Media FrameWork 框架概述 Media FrameWork 是 Android 系统中的一个重要模块,主要用于音视频的录制、播放与传输。它提供了许多功能丰富的组件,如 MediaPlayer、MediaRecorder、AudioTrack、AudioRecord 等类,为…

    other 2023年6月27日
    00
  • D3.js学习笔记—— 使用SVG坐标空间

    D3.js学习笔记——使用SVG坐标空间 D3.js是一个基于数据驱动的JavaScript库,用于创建动态、交互式的数据可视化。在D3.js中,我们可以使用SVG坐标空间来创建各种形状和图形。本文将详细介绍如何使用SVG坐标空间,并提供两个示例说明。 SVG坐标空间 SVG坐标空间是一个二维坐标系,用于描述SVG图形的位置和大小。在SVG坐标空间中,原点位…

    other 2023年5月5日
    00
  • CAD32位和64位有什么区别 CAD32位和64位区别介绍

    CAD软件是计算机辅助设计软件,它可以帮助工程师和设计师创建、修改和分析各种设计。CAD软件通常有32位和64位两个版本,它们之间有以下区别: 内存访问能力:32位CAD软件最多只能访问4GB的内存,而64位CAD软件可以访问更大的内存空间。这意味着在处理大型和复杂的设计文件时,64位CAD软件可以更高效地运行,因为它可以利用更多的内存来处理数据。例如,当你…

    other 2023年7月28日
    00
  • Highchart基础教程-图表的主要组成

    下面是“Highchart基础教程-图表的主要组成的完整攻略”,包括图表的主要组成、使用方法、两个示例说明等方面。 图表的主要组成 Highchart是一个基于JavaScript的图表库,它可以用来创建各种类型的图表,包括线图、柱状图、饼图等。一个Highchart图表主要由以下几个组成部分: 标题:用于描述图表的主题或主要内容。 坐标轴:用于显示数据的坐…

    other 2023年5月5日
    00
  • 使用delphi10.2开发linux上的daemon

    使用Delphi 10.2开发Linux上的Daemon攻略 Delphi是一款流行的集成开发环境(IDE),可以用于开发Windows和应用程序。在Linux上,可以使用Delphi开发Daemon程序。以下是详细略: 步骤 以下是使用Delphi 10.2发Linux上的Daemon程序的步骤: 安装Delphi 10.2。 使用Delphi 10.2开…

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