2024年最全详解双向链表的基本操作(C语言)_c语言双向链表的移动功能(1),2024百度物联网嵌入式开发岗面试真题收录解析

收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
img
img

如果你需要这些资料,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

与添加到表头是一个道理,实现过程如下:
  找到双链表中最后一个节点;
  让新节点与最后一个节点进行双层逻辑关系;
在这里插入图片描述

/\*在第add位置的前面插入data节点\*/
Node \* InsertListHead(Node \* head,int add,int data)
{
    /\*新建数据域为data的结点\*/
    Node \* temp=(Node\*)malloc(sizeof(Node));
    if(temp== NULL)
    {
        printf("malloc error!\r\n");
        return NULL;
    }    
    else
    {
        temp->data=data;
        temp->pre=NULL;
        temp->next=NULL; 
    }
    /\*插入到链表头,要特殊考虑\*/
    if (add==1)
    {
        temp->next=head;
        head->pre=temp;
        head=temp;
    }
    else
    {
        Node \* body=head;
        /\*找到要插入位置的前一个结点\*/
        for (int i=1; i<add-1; i++)
        {
            body=body->next;
        }
        /\*判断条件为真,说明插入位置为链表尾\*/
        if (body->next==NULL)
        {
            body->next=temp;
            temp->pre=body;
        }
        else
        {
            body->next->pre=temp;
            temp->next=body->next;
            body->next=temp;
            temp->pre=body;
        }
    }
    return head;
}


/\*在第add位置的后面插入data节点\*/
Node \* InsertListEnd(Node \* head,int add,int data)
{
    int i = 1;
    /\*新建数据域为data的结点\*/
    Node \* temp=(Node\*)malloc(sizeof(Node));
    temp->data=data;
    temp->pre=NULL;
    temp->next=NULL;

    Node \* body=head;
    while ((body->next)&&(i<add+1))
    {
        body=body->next;
        i++;
    }
    
    /\*判断条件为真,说明插入位置为链表尾\*/
    if (body->next==NULL)
    {
        body->next=temp;
        temp->pre=body;
        temp->next=NULL;
    }
    else
    {
        temp->next=body->pre->next;
        temp->pre=body->pre;
        body->next->pre=temp;
        body->pre->next=temp;

    }

    return head;
}

4.双向链表的删除

双链表删除结点时,只需遍历链表找到要删除的结点,然后将该节点从表中摘除即可。
  例如,删除元素 2 的操作过程如图 所示:
在这里插入图片描述

Node \* DeleteList(Node \* head,int data)
{
    Node \* temp=head;
    /\*遍历链表\*/
    while (temp)
    {
        /\*判断当前结点中数据域和data是否相等,若相等,摘除该结点\*/
        if (temp->data==data) 
        {
            /\*判断是否是头结点\*/
            if(temp->pre == NULL)
            {
                head=temp->next;
                temp->next = NULL;
                free(temp);
                return head;
            }
            /\*判断是否是尾节点\*/
            else if(temp->next == NULL)
            {
                temp->pre->next=NULL;
                free(temp);
                return head;
            }
            else
            {
                temp->pre->next=temp->next;
                temp->next->pre=temp->pre;
                free(temp);
                return head;   
            }
            

        }
        temp=temp->next;
    }
    printf("Can not find %d!\r\n",data);
    return head;
}

5.双向链表更改节点数据

更改双链表中指定结点数据域的操作是在查找的基础上完成的。实现过程是:通过遍历找到存储有该数据元素的结点,直接更改其数据域即可。

/\*更新函数,其中,add 表示更改结点在双链表中的位置,newElem 为新数据的值\*/
Node \*ModifyList(Node \* p,int add,int newElem)
{
    Node \* temp=p;
    /\*遍历到被删除结点\*/
    for (int i=1; i<add; i++) 
    {
        temp=temp->next;
    }
    temp->data=newElem;
    return p;
}

6.双向链表的查找

通常,双向链表同单链表一样,都仅有一个头指针。因此,双链表查找指定元素的实现同单链表类似,都是从表头依次遍历表中元素。

/\*head为原双链表,elem表示被查找元素\*/
int FindList(Node \* head,int elem)
{
/\*新建一个指针t,初始化为头指针 head\*/
    Node \* temp=head;
    int i=1;
    while (temp) 
    {
        if (temp->data==elem)
        {
            return i;
        }
        i++;
        temp=temp->next;
    }
    /\*程序执行至此处,表示查找失败\*/
    return -1;
}

7.双向链表的打印

/\*输出链表的功能函数\*/
void PrintList(Node \* head)
{
    Node \* temp=head;
    while (temp) 
    {
        /\*如果该节点无后继节点,说明此节点是链表的最后一个节点\*/
        if (temp->next==NULL) 
        {
            printf("%d\n",temp->data);
        }
        else
        {
            printf("%d->",temp->data);
        }
        temp=temp->next;
    }
}

8.测试函数及结果

int main() 
{
    Node \* head=NULL;
    //创建双链表
    head=CreatList(head,5);
    printf("新创建双链表为\t");
    PrintList(head);
    //在表中第 5 的位置插入元素 1
    head=InsertListHead(head, 5,1);
    printf("在表中第 5 的位置插入元素 1\t");
    PrintList(head);
    //在表中第 3 的位置插入元素 7
    head=InsertListEnd(head, 3, 7);
    printf("在表中第 3 的位置插入元素 7\t");
    PrintList(head);
    // //表中删除元素 7
    head=DeleteList(head, 7);
    printf("表中删除元素 7\t\t\t");
    PrintList(head);
    printf("元素 1 的位置是\t:%d\n",FindList(head,1));
    //表中第 3 个节点中的数据改为存储 6
    head = ModifyList(head,3,6);
    printf("表中第 3 个节点中的数据改为存储6\t");
    PrintList(head);
    return 0;
}

在这里插入图片描述
大家的鼓励是我继续创作的动力,如果觉得写的不错,欢迎关注,点赞,收藏,转发,谢谢!
以上代码均为测试后的代码。如有错误和不妥的地方,欢迎指出。
部分内容参考网络,如有侵权,请联系删除。

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

-Rm3ozzWa-1715638101932)]
[外链图片转存中…(img-FxzvB4gL-1715638101933)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值