单链表的基本操作

一、初始化

初始化是使用单链表前必须要进行的操作。因为一个新的单链表并没有指向任何节点,所以必须将其初始化为空,即头指针指向NULL。

typedef struct Node{
    int data;
    struct Node *next;
}Node, *LinkList;

//初始化链表
LinkList initList(){
    Node *head = (Node*)malloc(sizeof(Node));
    head->next = NULL;
    return head;
}

以上代码中,我们定义了一个结构体Node,包括数据域data和指针域next。而LinkList类型是struct Node*的别名,可以直接使用LinkList作为函数返回值。

二、插入元素

单链表的插入操作分为头插法和尾插法。其中头插法将新节点插入到链表头部,尾插法则将新节点插入链表尾部。

1.头插法

头插法是将每个新节点插入到链表头部。主要步骤有:

1.创建新节点p,设置其数据域为x,并将其next指针指向头节点的下一个节点。

2.将头节点的next指针指向新节点p。

//头插法插入节点
void insertHead(LinkList L, int x){
    Node *p = (Node*)malloc(sizeof(Node));
    p->data = x;
    p->next = L->next;
    L->next = p;
}

2.尾插法

尾插法是将每个新节点插入到链表尾部。主要步骤也很简单:

1.创建新节点p,设置其数据域为x,并将其next指针指向NULL。

2.找到链表最后一个节点,并将其next指针指向新节点p。

//尾插法插入节点
void insertTail(LinkList L, int x){
    Node *p = (Node*)malloc(sizeof(Node));
    p->data = x;
    p->next = NULL;
    Node *cur = L;
    while(cur->next) cur = cur->next;
    cur->next = p;
}

三、删除元素

删除元素就是将链表中指定的节点删除。其步骤包括:

1.查找需要删除的节点。

2.将待删除节点的前一个节点的next指针指向待删除节点的下一个节点。

3.释放待删除节点的内存。

//删除链表中第i(i>=1)个节点
void deleteNode(LinkList L, int i){
    Node *cur = L;
    for(int j = 1; j next;
    if(!cur || !cur->next) return;    //链表长度不够i个
    Node *del = cur->next;
    cur->next = del->next;
    free(del);
}

四、遍历链表

遍历链表就是按照链表的顺序将节点的值输出。遍历操作很简单,只需要从头节点的下一个节点开始依次遍历到链表结尾即可。

//遍历链表并输出每个节点的值
void traverse(LinkList L){
    Node *cur = L->next;
    while(cur){
        printf("%d ", cur->data);
        cur = cur->next;
    }
}

五、查找元素

查找元素需要遍历链表,查找目标节点的值与链表中每个节点的值逐一比较。如果查找到目标节点,则返回该节点在链表中的位置,否则返回0。

//查找值为x的节点并返回其位置
int search(LinkList L, int x){
    int i = 1;
    Node *cur = L->next;
    while(cur){
        if(cur->data == x) return i;
        cur = cur->next;
        i++;
    }
    return 0;
}

六、完整代码示例

typedef struct Node{
    int data;
    struct Node *next;
}Node, *LinkList;

//初始化链表
LinkList initList(){
    Node *head = (Node*)malloc(sizeof(Node));
    head->next = NULL;
    return head;
}

//头插法插入节点
void insertHead(LinkList L, int x){
    Node *p = (Node*)malloc(sizeof(Node));
    p->data = x;
    p->next = L->next;
    L->next = p;
}

//尾插法插入节点
void insertTail(LinkList L, int x){
    Node *p = (Node*)malloc(sizeof(Node));
    p->data = x;
    p->next = NULL;
    Node *cur = L;
    while(cur->next) cur = cur->next;
    cur->next = p;
}

//删除链表中第i(i>=1)个节点
void deleteNode(LinkList L, int i){
    Node *cur = L;
    for(int j = 1; j next;
    if(!cur || !cur->next) return;    //链表长度不够i个
    Node *del = cur->next;
    cur->next = del->next;
    free(del);
}

//遍历链表并输出每个节点的值
void traverse(LinkList L){
    Node *cur = L->next;
    while(cur){
        printf("%d ", cur->data);
        cur = cur->next;
    }
}

//查找值为x的节点并返回其位置
int search(LinkList L, int x){
    int i = 1;
    Node *cur = L->next;
    while(cur){
        if(cur->data == x) return i;
        cur = cur->next;
        i++;
    }
    return 0;
}

//测试代码
int main(){
    LinkList L = initList();
    insertHead(L, 1);
    insertTail(L, 2);
    insertTail(L, 3);
    deleteNode(L, 2);
    traverse(L);
    printf("\n%d\n", search(L, 2));
    return 0;
}

原创文章,作者:QMLY,如若转载,请注明出处:https://www.506064.com/n/131908.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
QMLYQMLY
上一篇 2024-10-03 23:48
下一篇 2024-10-03 23:48

相关推荐

  • 利用Python实现两个链表合并为一个有序链表

    对于开发工程师来说,实现两个链表合并为一个有序链表是必须掌握的技能之一。Python语言在链表处理上非常便利,本文将从多个方面详细阐述如何利用Python实现两个链表合并为一个有序…

    编程 2025-04-29
  • Python栈操作用法介绍

    如果你是一位Python开发工程师,那么你必须掌握Python中的栈操作。在Python中,栈是一个容器,提供后进先出(LIFO)的原则。这篇文章将通过多个方面详细地阐述Pytho…

    编程 2025-04-29
  • Python基本索引用法介绍

    Python基本索引是指通过下标来获取列表、元组、字符串等数据类型中的元素。下面将从多个方面对Python基本索引进行详细的阐述。 一、列表(List)的基本索引 列表是Pytho…

    编程 2025-04-29
  • Python操作数组

    本文将从多个方面详细介绍如何使用Python操作5个数组成的列表。 一、数组的定义 数组是一种用于存储相同类型数据的数据结构。Python中的数组是通过列表来实现的,列表中可以存放…

    编程 2025-04-29
  • Python基本数字类型

    本文将介绍Python中基本数字类型,包括整型、布尔型、浮点型、复数型,并提供相应的代码示例以便读者更好的理解。 一、整型 整型即整数类型,Python中的整型没有大小限制,所以可…

    编程 2025-04-29
  • Python操作MySQL

    本文将从以下几个方面对Python操作MySQL进行详细阐述: 一、连接MySQL数据库 在使用Python操作MySQL之前,我们需要先连接MySQL数据库。在Python中,我…

    编程 2025-04-29
  • Python磁盘操作全方位解析

    本篇文章将从多个方面对Python磁盘操作进行详细阐述,包括文件读写、文件夹创建、删除、文件搜索与遍历、文件重命名、移动、复制、文件权限修改等常用操作。 一、文件读写操作 文件读写…

    编程 2025-04-29
  • Python代码实现回文数最少操作次数

    本文将介绍如何使用Python解决一道经典的回文数问题:给定一个数n,按照一定规则对它进行若干次操作,使得n成为回文数,求最少的操作次数。 一、问题分析 首先,我们需要了解回文数的…

    编程 2025-04-29
  • Python基本统计量计算

    本文将从多个方面详细介绍Python中基本统计量计算的方法。 一、均值 均值是一组数据的平均值,也就是将所有数据相加后再除以数据个数。 在Python中,可以使用numpy库中的m…

    编程 2025-04-29
  • Python程序的三种基本控制结构

    控制结构是编程语言中非常重要的一部分,它们指导着程序如何在不同的情况下执行相应的指令。Python作为一种高级编程语言,也拥有三种基本的控制结构:顺序结构、选择结构和循环结构。 一…

    编程 2025-04-29

发表回复

登录后才能评论