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日

相关文章

  • java查看数据类型的方法

    Java查看数据类型的方法 在Java编程中,我们经常需要查看变量的数据类型。有许多方法可以查看数据类型,本文将介绍常用的三种方法。 1. 使用typeof运算符 在JavaScript中,可以使用typeof运算符来查看变量的数据类型,但在Java中并不支持。Java中需要使用Class类的对象来表示数据类型。 Class<?> dataTyp…

    其他 2023年3月28日
    00
  • Windows Server2012 R2 FTP服务器配置图文教程

    Windows Server2012 R2 FTP服务器配置图文教程 简介 本文主要介绍如何在 Windows Server 2012 R2 操作系统中配置 FTP 服务器。FTP 是一种常用的文件传输协议,通过配置 FTP 服务器,可以实现在不同计算机之间方便地传输文件。 准备工作 在开始配置 FTP 服务器之前,需要进行以下准备工作: 确保 Window…

    other 2023年6月27日
    00
  • python如何查询mysql

    以下是Python如何查询MySQL的完整攻略,包括MySQL连接、查询、结果处理等内容,过程中包含两个示例说明。 1. MySQL连接 在Python中,我们可以使用mysql-connector-python模块来连接MySQL数据库。以下是一个连接MySQL数据库的示例: import mysql.connector # 连接MySQL数据库 mydb…

    other 2023年5月10日
    00
  • iPhoneXs Max怎么增加手机内存

    iPhone XS Max增加手机内存攻略 如果你想增加iPhone XS Max的手机内存,以下是一些方法和示例说明,供你参考: 1. 使用云存储服务 云存储服务可以帮助你将文件和数据存储在云端,从而释放设备的内存空间。以下是两个示例: iCloud: iCloud是苹果提供的云存储服务,它可以自动备份你的照片、视频、文档等,并将它们存储在云端。你可以在设…

    other 2023年8月2日
    00
  • Java重写与重载之间的区别

    下面是“Java重写与重载之间的区别”的详细讲解攻略。 一、概述 Java中的方法支持两种不同的机制,即重写和重载。虽然这两种机制旨在实现方法的多态性,但它们的实现方式不同。因此必须理解它们之间的区别,才能正确使用它们。 二、方法的重载(Overloading) 方法重载是指在一个类中定义多个相同名称但参数列表不同的方法。在Java中,方法的参数列表不仅包括…

    other 2023年6月27日
    00
  • python中super().__init__()作用详解

    下面我将详细讲解一下 “python中super().init()作用详解” 的相关知识。 什么是super().init()方法? 在Python中,当我们定义一个子类(派生类)时,如果需要对其父类(基类)的属性或方法进行调用,我们通常使用 super() 函数。super() 函数返回一个临时的对象,通过该对象可以调用父类中的方法。 而对于 super(…

    other 2023年6月27日
    00
  • 如何清除网页上自动保存的登陆用户名密码

    清除网页上自动保存的登录用户名密码,可以分为两种情况,一种是浏览器自动填充功能保存的表单数据,另一种是浏览器缓存密码保存功能。针对这两种情况,我们分别介绍如何清楚这些保存的账户密码。 清除浏览器自动填充保存的表单数据 许多浏览器都会提供自动填充功能,自动保存表单数据,包括用户名和密码。一般在输入表单时,浏览器会自动弹出保存对话框,如果保存了账户密码,下次输入…

    other 2023年6月27日
    00
  • bxslider使用教程

    以下是bxslider使用教程的完整攻略: 什么是bxslider? bxslider是一个基于jQuery的响应式图片轮播插件,可以用于创建漂亮的幻灯片、轮播图滑块等。 步骤1:引入bxslider 首先,需要HTML文件中引入jQuery和bxslider的CSS和JS文件,例如: <head> <link rel="styl…

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