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日

相关文章

  • C# 使用SqlBulkCopy类批量复制大数据

    C#使用SqlBulkCopy类批量复制大数据的完整攻略 在C#中,可以使用SqlBulkCopy类批量复制大数据。本文将为您提供一份完整攻略,包括SqlBulkCopy类的使用方法、注意事项和两个示例说明。 SqlBulkCopy类 SqlBulkCopy类是.NET Framework中的一个类,用于将大量数据从一个数据源复制到另一个数据源。SqlBul…

    other 2023年5月5日
    00
  • mysql命名规范

    以下是关于“MySQL命名规范”的完整攻略: MySQL命名规范 在MySQL中,命名规范是非常重要的,它可以提高可读性和可护性。以下是MySQL命名规范的一些基本原则: 使用有意义的名称:表名、名、索引名等应该使用有意义的名称,能够清晰地表达其含义。 使用小写字母:MySQL不区分大小写,但是为了提高可读性,建议使用小写字母。 使用下划线分单词:在表、列名…

    other 2023年5月9日
    00
  • synchronized优化

    synchronized优化 Java中的synchronized关键字是用来控制线程访问共享资源的并发机制。然而,如果不恰当地使用它,就很容易导致线程死锁、性能下降等问题。因此,针对synchronized的优化是非常重要的。 以下是几种优化synchronized的方法: 减小同步代码块的粒度 synchronized(锁定)操作是需要一定的系统开销的。…

    其他 2023年3月29日
    00
  • centos7部署ssserver

    CentOS 7 部署 ssserver 完整攻略 ssserver 是一个基于 Python 的 Shadowsocks 服务器,用于加密和代理网络流量。在本攻略,我们将详细介绍如何在 CentOS 7 上部署 ssserver。 步骤1:安装 Python 和 pip 在部署 server 之前,需要先安装 Python 和 pip。以下是一个示例命令:…

    other 2023年5月6日
    00
  • 用C++实现推箱子小游戏

    用C++实现推箱子小游戏完整攻略 推箱子是一款经典的益智游戏,是许多程序员入门学习游戏开发的练手项目之一。下面我们将讲解如何用C++实现推箱子小游戏的完整攻略。 步骤一:环境搭建 首先,我们需要安装C++的开发环境。推荐使用Visual Studio作为开发工具,可以从官网下载安装。 安装后,打开Visual Studio,创建一个新的空项目。在项目中创建一…

    other 2023年6月26日
    00
  • linux手工配置ip地址详细步骤

    Linux手工配置IP地址详细步骤 在Linux系统中,手工配置IP地址可以通过修改网络配置文件来实现。下面是详细的步骤: 打开终端,以管理员权限登录到Linux系统。 使用以下命令进入网络配置文件所在目录: cd /etc/sysconfig/network-scripts/ 列出该目录下的网络配置文件,找到需要配置的网络接口文件,一般以ifcfg-&lt…

    other 2023年7月30日
    00
  • Win10正式版累计更新14393.970补丁KB4016637今日推送

    Win10正式版累计更新14393.970补丁KB4016637今日推送攻略 简介 Win10正式版累计更新14393.970补丁KB4016637是微软今日推送的一项重要更新。该补丁旨在修复系统中的一些漏洞和问题,提升系统的稳定性和安全性。本攻略将详细介绍如何安装和应用该补丁。 步骤 备份重要数据:在进行任何系统更新之前,建议备份重要的个人数据。这可以防止…

    other 2023年8月3日
    00
  • vantdialog弹出框

    以下是“vant-dialog弹出框”的完整攻略: vant-dialog弹出框 vant-dialog是Vant组件库中的一个弹出框组件,可以用于在页面中弹出对话框,提示用户进行或展示信息。本攻略将详细讲解vant-dialog的使用方法,包括基本用法、API参数和示例说明等。 基本用法 vant-dialog的基本用法非常简单,只需要在Vue组件中引入v…

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