服务器之家

服务器之家 > 正文

C语言 单向链表的增删查改快速掌握

时间:2022-02-24 14:42     来源/作者:薛定谔的猫~

前言

链表是线性表的链式存储结构,它可以以O(1)的时间复杂度进行插入或者删除,同时由于是链式结构相比顺序表而言,不会存在空间浪费的情况。而链表又分为带头单向链表,不带头单向链表,带头循环链表,不带头循环链表,带头双向循环链表,不带头双向循环链表,带头双向链表,不带头双向链表,总共有八种,其中结构最简单的是不带头单向链表,也是实现起来最容易出错的。并且我们在网上进行链表的oj时,题目基本也是不带头的单向链表,而且也是互联网大厂面试中最容易考的。

一、创建

?
1
2
3
4
5
6
7
typedef int SLTDadaType;//存放的数据类型
struct SListNode
{
    SLTDadaType _data;//存放的数据
    struct SListNode* _next;//指向下一个节点的指针
};
typedef struct SListNode  SListNode;

二、单向链表的函数声明

?
1
2
3
4
5
6
7
SListNode* BuyListNode(SLTDadaType x);//创建一个节点
SListNode* SListPushBack(SListNode* head, SLTDadaType x);//尾插
SListNode* SListPopBack(SListNode* head);//头插
SListNode* SListPushFornt(SListNode* head, SLTDadaType x);//尾删
SListNode* SListPopFornt(SListNode* head);//头删
SListNode* SListFind(SListNode* head, SLTDadaType x);//查找一个节点
void SListModify(SListNode* head, SLTDadaType x,SLTDadaType y);//x修改

三、函数实现

1.创建节点

?
1
2
3
4
5
6
7
SListNode* BuyListNode(SLTDadaType x)
{
    SListNode* newnode = (SListNode*)malloc(sizeof(SListNode));
    newnode->_data = x;
    newnode->_next = NULL;
    return newnode;
}

2.尾插节点

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
SListNode* SListPushBack(SListNode* head, SLTDadaType x)
{
    SListNode* newnode = BuyListNode(x);//无论节点是否为空,都先进行创建一个节点
 
    if (head == NULL)  //头节点为空
    {
        head = newnode;
        return head;
    }
    else //头节点不为空,直接遍历到链表结尾进行尾插
    {
        SListNode* tail = head;
        while (tail->_next != NULL)
        {
            tail = tail->_next;
        }
        tail->_next = newnode;
        return head;
    }
}

3.头插

?
1
2
3
4
5
6
7
SListNode* SListPushFornt(SListNode* head, SLTDadaType x)
{
    SListNode* newnode = BuyListNode(x);
    newnode->_next = head;
    head = newnode;
    return head;
}

4.尾删

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
SListNode* SListPopBack(SListNode* head)
{
    //1.空
    //2.只有一个节点
    //3.有多个节点
    if (head == NULL)
    {
        return head;
    }
    else if (head->_next== NULL)
    {
        free(head);
        head = NULL;
        return head;
    }
    else
    {
        SListNode* prev = NULL;
        SListNode* tail = head;
        while (tail->_next != NULL)  //利用前指针来保存要删除的节点的前一个节点
        {
            prev = tail;
            tail = tail->_next;
        }
        free(tail);
        if (prev != NULL)
        prev->_next = NULL;
        return head;
    }
}

5.头删

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SListNode* SListPopFornt(SListNode* head)
{
 
    if (head == NULL)
    {
        return head;
    }
    else
    {
        SListNode* cur = head->_next;
        free(head);
        head = cur;
        return head;
    }
}

6.查找节点

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SListNode* SListFind(SListNode* head, SLTDadaType x)
{
    SListNode* cur = head;
    while (cur)
    {
        if (cur->_data == x)
        {
            return cur;
        }
        else
        {
            cur = cur->_next;
        }
    }
    return NULL;
}

7.修改

?
1
2
3
4
5
6
7
8
9
10
11
12
void SListModify(SListNode* head, SLTDadaType x, SLTDadaType y)//x修改
{
    SListNode* find = SListFind(head, x);
    if (find)
    {
        find->_data = y;
    }
    else
    {
        printf("对不起,您要修改的值不存在\n");
    }
}

总结

本篇文章主要是针对单向链表一些基本操作的代码实现,若有写的错误或值得改进的地方,请大家多多留言指出。

最后,也请大家多多支持,求关注!!!

到此这篇关于C语言 单向链表的增删查改快速掌握的文章就介绍到这了,更多相关C语言 单向链表内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/weixin_52843203/article/details/120510139

相关文章

热门资讯

蜘蛛侠3英雄无归3正片免费播放 蜘蛛侠3在线观看免费高清完整
蜘蛛侠3英雄无归3正片免费播放 蜘蛛侠3在线观看免费高清完整 2021-08-24
2022年最旺的微信头像大全 微信头像2022年最新版图片
2022年最旺的微信头像大全 微信头像2022年最新版图片 2022-01-10
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
返回顶部