C语言数据结构超详细讲解单向链表

标题:C语言数据结构超详细讲解单向链表

简介

本文主要介绍C语言中的单向链表数据结构,包括单向链表的基本操作及其实现方式。学习本文需要读者已经掌握C语言基础知识。

单向链表概述

单向链表是一种常见的线性数据结构,它由一系列节点组成,每个节点包含两个部分:数据部分和指向下一个节点的指针。最后一个节点的指针为空指针,即指向NULL。单向链表的头节点没有数据,只有指针。

以下是一个单向链表的示意图:

头节点 → 节点1 → 节点2 → 节点3 → NULL

单向链表的基本操作

1. 创建单向链表

创建单向链表包括两个步骤:创建头节点、添加节点。

创建头节点:

struct Node *head;
head = (struct Node *)malloc(sizeof(struct Node));
head->data = 0; // 头结点没有实际的数据,设为0
head->next = NULL;

添加节点:

struct Node *p, *q;
int n, data, i;
printf("请输入节点个数n:");
scanf("%d", &n);
q = head;
for (i = 1; i <= n; i++) {
    p = (struct Node *)malloc(sizeof(struct Node));
    printf("请输入第%d个节点的值:", i);
    scanf("%d", &data);
    p->data = data;
    p->next = NULL;
    q->next = p;
    q = p;
}

2. 遍历单向链表

遍历单向链表:

struct Node *p;
p = head->next; // 从第一个节点开始遍历
while(p) {
    printf("%d ", p->data);
    p = p->next;
}

3. 获取单向链表的长度

获取单向链表的长度:

int length(struct Node *head) {
    int len = 0;
    struct Node *p;
    p = head->next;
    while(p) {
        len++;
        p = p->next;
    }
    return len;
}

4. 插入节点

插入节点包括两种情况:插入到头节点之后、插入到指定位置之后。

插入头节点之后:

void insert(struct Node *head, int data) {
    struct Node *p;
    p = (struct Node *)malloc(sizeof(struct Node));
    p->data = data;
    p->next = head->next;
    head->next = p;
}

插入指定位置之后:

void insert(struct Node *head, int pos, int data) {
    struct Node *p, *q;
    int i;
    p = head;
    for (i = 1; i < pos; i++) {
        p = p->next;
        if (p == NULL) {
            printf("插入位置无效\n");
            return;
        }
    }
    q = (struct Node *)malloc(sizeof(struct Node));
    q->data = data;
    q->next = p->next;
    p->next = q;
}

5. 删除节点

删除节点包括两种情况:删除节点本身、删除指定位置的节点。

删除节点本身:

void delete(struct Node *head, struct Node *p) {
    struct Node *q;
    q = p->next;
    p->data = q->data;
    p->next = q->next;
    free(q);
    q = NULL;
}

删除指定位置的节点:

void delete(struct Node *head, int pos) {
    struct Node *p, *q;
    int i;
    p = head;
    for (i = 1; i < pos; i++) {
        p = p->next;
        if (p == NULL) {
            printf("删除位置无效\n");
            return;
        }
    }
    q = p->next;
    p->next = q->next;
    free(q);
    q = NULL;
}

示例说明

示例1

假设现在有一个单向链表:

头节点 → 节点1 → 节点2 → 节点3 → NULL

现在需要在节点2和节点3之间插入一个值为4的节点。代码如下:

insert(head, 3, 4);

插入后单向链表变为:

头节点 → 节点1 → 节点2 → 节点4 → 节点3 → NULL

示例2

现在有一个单向链表:

头节点 → 节点1 → 节点2 → 节点3 → NULL

现在需要删除节点2。代码如下:

delete(head, head->next);

删除后单向链表变为:

头节点 → 节点1 → 节点3 → NULL

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言数据结构超详细讲解单向链表 - Python技术站

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

相关文章

  • 易语言创建大漠模块及免注册调用大漠

    以下是关于“易语言创建大漠模块及免注册调用大漠”的完整攻略,包含两个示例。 易语言创建大漠模块及免注册调用大漠 大漠插件是一款常用的自动化工具,可以帮助开发人员实现自动化操作。在易语言中,我们可以通过创建大漠模块来调用大漠插件。下面我们将介绍如何大漠模块和免注册调用大漠。 1. 创建大漠模块 以下是一个使用易语言创建大漠模块的示例: 打开易语言,创建一个新的…

    other 2023年5月9日
    00
  • Iptables防火墙自定义链表实现方式

    Iptables是一个非常强大的Linux防火墙工具,可以在网络层次上实现数据包的过滤与转发,保护网络安全。自定义链表是Iptables的一大特性,可以将复杂的规则划分到逻辑分组,提高规则的可读性和维护性。Iptables中默认包含了多个链表,如INPUT、OUTPUT、FORWARD等,我们可以在这些链表中自定义新的链表,也可以将自定义的链表插入到默认链表…

    other 2023年6月27日
    00
  • 特殊用途的IP地址介绍

    特殊用途的IP地址介绍攻略 特殊用途的IP地址是为了满足特定需求而保留的一些IP地址范围。这些地址不用于常规的网络通信,而是用于特殊目的,如私有网络、广播、测试和回环等。在本攻略中,我们将详细介绍几种常见的特殊用途IP地址,并提供示例说明。 1. 私有IP地址 私有IP地址是为了在私有网络中使用而保留的地址范围。这些地址不在公共互联网上路由,因此可以在组织内…

    other 2023年7月30日
    00
  • Vue通过阿里云oss的url连接直接下载文件并修改文件名的方法

    以下是详细讲解”Vue通过阿里云oss的url连接直接下载文件并修改文件名的方法”的完整攻略: 阿里云oss相关准备 首先,需要在阿里云oss上创建一个bucket,并将需要下载的文件上传到该bucket中。然后,在权限管理中,将该bucket的跨域资源共享(CORS)配置添加如下代码,以允许其他域名的网站直接访问该bucket中的文件: [ { &quot…

    other 2023年6月26日
    00
  • Javascript通过控制类名更改样式

    下面是详细讲解 Javascript 通过控制类名更改样式的攻略。 什么是控制类名更改样式? 在网页开发中,我们经常需要对页面的样式进行管理和控制,而传统的做法通常是使用 JavaScript 直接操作样式属性。但这种做法不仅会使代码繁琐,而且在样式修改频繁的情况下难以维护。而通过控制类名更改样式,则是一种更加高效和可维护的做法,其基本思路是利用类名和 CS…

    other 2023年6月27日
    00
  • Python3.x:自动生成IP写入文本

    Python3.x:自动生成IP写入文本 在软件测试中,我们经常需要进行IP地址的测试。有时,测试要求我们使用一个IP地址列表,这时我们就需要手动输入每个IP地址。如何可以简化IP地址列表的生成过程呢?这里,我们可以用Python脚本来实现自动生成IP地址列表,并将结果写入到文本文件中。 生成IP地址 在Python中,我们可以使用ipaddress模块来生…

    其他 2023年3月28日
    00
  • Eureka源码阅读解析Server服务端启动流程实例

    Eureka源码阅读解析: Server服务端启动流程实例 背景介绍 Eureka是Netflix开源的基于RESTful风格的服务注册和发现组件,主要是为了解决动态集群下的弹性的问题,尤其是在云计算中自动化资源管理的需求。 Server服务端启动流程说明 以下是Eureka Server服务端的启动流程: EurekaServerAutoConfigura…

    other 2023年6月27日
    00
  • 电脑死机怎么办 电脑死机按什么键恢复

    针对“电脑死机怎么办 电脑死机按什么键恢复”这个问题,以下是完整的攻略。 1. 电脑死机的原因 电脑死机的原因一般分为硬件问题和软件问题: 硬件问题:指电脑内部硬件出现故障或者损坏,如内存条、硬盘、CPU等。 软件问题:指电脑系统或者应用程序出现异常或者错误,如无响应或卡顿等。 2. 处理电脑死机的步骤 在处理电脑死机问题时,一般可以采取以下的步骤: 步骤1…

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