链表的插入和删除

Posted 橙子果果

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了链表的插入和删除相关的知识,希望对你有一定的参考价值。

链表的插入有前插和后插两种方法。


插入

后插:
1.静态创建一个链表。
2.声明一个指针p指向链表头结点。
3.判断链表的下一个是否为空,不为空执行循环。
4.遍历寻找需要插入的位置。(p = p->next)
5.将新节点的next指向插入位置的next。new->next = p->next.
6.插入位置的next执行新节点。 p->next = new.

在这里插入图片描述


int insertFromBehind(struct Test *head,int data,struct Test *new)
{
        struct Test *p = head;
        while( p != NULL){
                if(p->data == data){
                        new->next=p->next;
                        p->next = new;
                        return 1;
                }
                p=p->next;
        }return 0;
}
struct Test new = {100,NULL};
insertFromBehind(&t1,3,&new);
        printLink(&t1);

链表的创建的结构体定义连接上节
链表的创建的结构体定义


在这里插入图片描述

前插:

前插要考虑插入的位置是否是插入头结点前。
如果是在头结点前插入新节点,就要改变表头。

1.声明一个指针p指向head
2.判断插入的节点是否是头结点。
  p->data == data
3.遍历链表,判断链表节点的指向是否为空
 p->next != NULL
4.找到需要插入的节点
  if(p->next->data == data)
5.将新节点的next指向插入节点的next
 插入节点的next指向新节点
  new->next = p->next;
  p->next = new;
6.如果是在头结点前插入 最后返回new
 如果不是在头结点插入,最后返回head


struct Test* insertFormfor(struct Test *head,int data,struct Test *new)
{
        struct Test *p=head;
        if(p->data == data){
                new->next = head;
                return new;
        }
        while(p->next != NULL){
                if(p->next->data == data){
                        new->next = p->next;
                        p->next = new;
                        return head;
                }p = p->next;
        }
        printf("no data");
        return head;
}

struct Test new2 = {200,NULL};
        head = insertFormfor(head,1,&new2);
        printLink(head);
        
        struct Test new3 = {999,NULL};
        head = insertFormfor(head,5,&new3);
        printLink(head); 

链表的创建

最后输出结果
在这里插入图片描述


删除

1.定义一个指针p指向链表头
2.如果删除的是表头,直接链表头指向链表头的next
  head = head->next;
3.如果删除的是中间的位置。先遍历找到需要删除的节点,
  然后p->next = p->next->next->next.
4.最后返回head


这里删除链表节点,需要考虑空间释放。

在这里插入图片描述

struct Test* deletNode(struct Test *head,int data)
{
        struct Test *p = head;
        if(p->data == data){
                head = head->next;
                return head;
        }
        while(p->next != NULL){
                if(p->next->data == data){
                p->next = p->next->next;
                return head;

        }
                p = p->next;
        }return head;
}

验证链表是否删除成功
删除头结点

printf("************\\n");

        printLink(head);
        head = deletNode(head,1);
        printLink(head);

在这里插入图片描述


删除中间节点
printf("************\\n");

        printLink(head);
        head = deletNode(head,3);
        printLink(head);

在这里插入图片描述

以上是关于链表的插入和删除的主要内容,如果未能解决你的问题,请参考以下文章

《线性表的插入和删除算法实现》以及《栈和队列的插入和删除算法实现》的c语言代码

线性表的插入和删除操作代码(C语言)

链表的插入和删除

链表的插入和删除

数据结构代码(用C语言) 单链表的插入和删除

静态链表的插入和删除