链表的插入和删除

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);

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

JavaScript单向链表的创建遍历插入删除操作

静态链表的插入和删除

c语言 双向链表的简单操作-创建插入删除

数据结构:链表

链表的基本操作:创建插入删除

求C语言 数据结构中的链表创建,插入和删除代码