单链表与双链表插入节点(C 语言实现)

链表基本概念(详细内容可自己百度或查询相关书籍):
链表就是包含数据的独立数据结构的集合。链表中的每个节点通过链表或指针链接在一起,程序通过指针访问链表中的节点。
注: 链表的其他综合实践案例可到我的资源查看下载,没有币的小伙伴可以给我留言,可以打包发送。

单链表:
在单链表中,每个节点包含一个指向下一节点的指针。链表最后一个节点的指针字段的值为NULL,表示链表后面不在有其他节点了。遍历单链表的可以从链表开始位置开始直到结束位置,但链表不可以从相反的方向进行遍历。后面介绍的双链表则可解决此问题。

1.插入到一个有序的单链表

/*
   单链表插入节点
 */
 #include <stdio.h>
#include <stdlib.h>
#define TRUE  1
#define FALSE 0

typedef struct NODE
{
 struct NODE *link;
 int    value;
}Node;
int sll_insert(Node **linkp, int new_value);

int main()
{
    int ret_val;
    int a = 12;
    Node **link ;
    sll_insert(link, a);
    return 0;
}

int sll_insert(Node **linkp, int new_value)
{
    register Node *current;
    register Node *new;
    /*寻找正确的插入位置,方法是按序访问链表,直到到达
      一个其大于或等于新值的节点*/
    while((current = *linkp ) != NULL && current ->                 value < new_value )
   linkp = &current -> link;
   /*为新节点分配内存,并把新值存储到新节点中*/
   new = (Node *)malloc(sizeof(Node));
   if(new == NULL)
       return FALSE;
   new -> value = new_value;

   //把新节点插入到链表中,并返回 TRUE
   new -> link = current;
   *linkp = new;
    return TRUE;
 }
 

双链表:
双链表是单链表很好的替代方案。在双链表中,每个节点都包含两个指针,一个指向前一个节点,一个指向后一个节点。这可以使我们以任何方式遍历双链表,甚至可以忽前忽后的在链表中访问。
2.双链表插入节点

/*
   双链表插入节点
 */
#include <stdio.h>
#include <stdlib.h>

 typedef struct NODE
{
 struct NODE *fwd;
 struct NODE *bwd;
 int value;
}Node;

int dll_insert(register Node *rootp, int value);
int main()
{
    register Node *root;
    static const int a = 10;
    dll_insert(root, a);
    return 0;
}

int dll_insert(register Node *rootp, int value)
{
     register Node *this;
     register Node *next;
     register Node *newnode;
     /*
         *查看value 是否已经存在于链表中,如果是就返回。
         *否则,为新值创建一个新节点("newnode"将指向他)
         *"this" 将指向应该在新节点之前的那个节点。
         *"next" 将指向应该在新节点之后的那个节点。  
    */
    for(this = rootp; (next = this -> fwd) != NULL;        this = next)
    {
       if(next -> value == value)
          return 0;
       if(next -> value >value)
          break;
    }
    newnode = (Node *)malloc(sizeof(Node));
    if(newnode == NULL)
        return -1;
    newnode -> value = value;
    
    if(this != rootp)
        newnode -> bwd = this;
    else
        newnode -> bwd = NULL;
    if(next != NULL)
        next -> bwd = newnode;
    else
        rootp -> bwd = newnode;
    return 1;
        
}

最后觉得有用不忘点赞或转发o ^ ^ o ,thank U ~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值
>