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

yizhihongxing

让我们来讲解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日

相关文章

  • HTML5中5个简单实用的API(第二篇,含全屏、可见性、拍照、预加载、电池状态)

    下面是一份详细的攻略,讲解HTML5中5个简单实用的API: HTML5中5个简单实用的API HTML5提供了很多有用的API,这里我们介绍5个简单实用的API,包括全屏、可见性、拍照、预加载和电池状态。 全屏API 使用全屏API,可以实现将Web页面以全屏模式下展示,给用户带来更好的阅读和游戏体验。全屏API支持所有Web浏览器,并且使用方法非常简单。…

    other 2023年6月25日
    00
  • EditText限制输入数字,精确到小数点后1位的设置方法

    当你想要限制用户在EditText中输入数字,并且要求精确到小数点后一位时,你可以按照以下步骤进行设置: 首先,在你的布局文件中,添加一个EditText组件: <EditText android:id=\"@+id/editText\" android:layout_width=\"match_parent\"…

    other 2023年9月5日
    00
  • IOS开发使用KeychainItemWrapper 持久存储用户名和密码

    IOS开发使用KeychainItemWrapper 持久存储用户名和密码 在 IOS 应用中,要求用户输入账户和密码以进行身份验证是很普遍的需求。但是,为了确保用户输入的凭证不会丢失或者被黑客攻击,我们需要在应用程序中使用安全的方式来存储这些凭证。KeychainItemWrapper 可以帮忙实现安全地存储这些凭证,下面详细介绍一下。 步骤 下载 Key…

    other 2023年6月27日
    00
  • Backdoor.Win32.IRCBot.afm(video.exe)病毒的处理方法

    Backdoor.Win32.IRCBot.afm(video.exe)病毒的处理方法 病毒概述 Backdoor.Win32.IRCBot.afm(video.exe)病毒是一种恶意软件,属于后门病毒,经常进入您的计算机,通过远程控制攻击者入侵。此病毒会在您的电脑内创建许多文件,也会修改您的计算机注册表来保持其持续运行。 病毒清理步骤 步骤一:离线杀毒 首…

    other 2023年6月27日
    00
  • [转载]什么情况下应该设置cudnn.benchmark=true?

    [转载]什么情况下应该设置cudnn.benchmark=true? 在深度学习中,使用GPU进行加速训练已经变得越来越普遍。但在使用GPU训练时,我们常常会遇到优化的问题,其中之一就是cudnn库的使用,而cudnn.benchmark的设置就成了解决该问题的一种重要方法。那么什么情况下应该设置cudnn.benchmark=true呢?让我们来探究一下。…

    其他 2023年3月28日
    00
  • dnsmasq应用手册

    dnsmasq应用手册 什么是dnsmasq? dnsmasq是一款轻便易用的DNS和DHCP服务器软件。它不仅能够为局域网中的计算机提供DNS解析服务,还能够为这些计算机分配 IP 地址。 安装dnsmasq 在Ubuntu系统中,可以使用以下命令来安装dnsmasq: sudo apt-get install dnsmasq 在CentOS系统中,可以使…

    其他 2023年4月16日
    00
  • 22端口通的 ssh拒绝连接

    简介 SSH(Secure Shell)是一种加密的网络协议,用于在网络上安全地传输数据。当我们尝试使用SSH连接到远程服务器时,有时会遇到“22端口通的ssh拒绝连接”的错误。在本攻略中,我们将介绍如何解决“22端口通的ssh拒绝连接”的问题。 步骤 以下是解决“22端口通的ssh拒绝连接”的问题的步骤。 步骤1:检查SSH服务是否正在运行 首先我们需要检…

    other 2023年5月6日
    00
  • 错误:sem_union的存储大小未知问题的解决方法

    这个错误是由于在程序中使用了未定义的结构体或者是未包含正确的头文件导致的。解决这个问题的方法非常简单,只需要包含正确的头文件或者定义相应的结构体即可。 以下是两个示例说明: 示例一: 在使用sem_union结构体时,可能会遇到sem_union的存储大小未知的问题。这是因为在程序中未定义sem_union结构体,所以编译器无法判断其大小。解决方法是在程序中…

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