单链表插入函数优化(C和指针)

本文介绍了一种在有序单链表中插入元素的方法,通过保持指向当前节点前一个节点的指针来确定新元素的位置,并提供了优化后的插入函数实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//链表实现插入函数

#define FALSE 0

#define TRUE  1

//单链表插入思想:始终保存一个指向链表当前节点之前的那个节点的指针。`

typedef struct NODE {

    struct NODE *link;

    int         value;

}Node;

//插入到一个有序的单链表。函数的参数是一个只向链表第一个节点的指针和需要插入的值。

int sll_insert(Node **rootp ,int new_value){

    Node *current=NULL;

    Node *previous=NULL;

    Node *new1;

    

    current= *rootp;

    //寻找正确的插入位置,方法是按顺序访问链表,直到到达其值大于或等于新插入值的节点

    while(current!=NULL&&current->value<new_value){

        previous=current;

        current=current->link;

    }

    new1=(Node *)malloc(sizeof(Node));

    if(new1==NULL )

        return FALSE;

    new1->value=new_value;

    

    //把新结点插入到链表中;

    new1->link=current;

    if(previous==NULL)*rootp=new1;

    else

        previous->link=new1;

    return TRUE;

}


优化插入函数:

特殊情况在于把一个节点插入到链表的起始位置,而消除这个特殊情况在于:我们必须认识到,链表中的每个节点都有一个指向它的指针,对于第一个节点,这个指针是跟指针;对于其他节点,这个指针是前一个节点的link字段。重点在于每个节点都有一个指针指向它。
我们只考虑指向这个节点的指针,至于哪个节点包含这个指针则无关要紧。
我们拥有一个指向当前节点的指针,以及一个“指向当前节点的link字段的”指针。
当移动到下一个节点时,我们保存一个“指向下一个节点的link字段的”指针,而不是保存一个指向当前一个节点的指针。
linkp 并不指向节点本身,而是指向节点内部的link字段,这是简化插入函数的关键所在 &current->link  就能取得这个字段。linkp指向的是不同的link字段,link指针可以负责寻找需要修改的link字段。用于处理特殊情况的代码也不见,因为始终拥有一个指向需要修改的link字段的指针——我们用一种和修改节点的link字段完全一样的方式修改root变量。
register生命用于提高代码效率。

 

//链表实现

#define FALSE 0

#define TRUE  1

//单链表插入思想:始终保存一个指向链表当前节点之前的那个节点的指针。`

typedef struct NODE {

    struct NODE *link;

    int         value;

}Node;

//插入到一个有序的单链表。函数的参数是一个指向链表第一个节点的指针和需要插入的值。

int sll_insert(register Node **linkp,int new_value){

    register Node *current=NULL;

    register Node *new1=NULL;

    //寻找正确的插入位置,方法是按顺序访问链表,直到到达一个其值大于或等于新值的节点

    while((current=*linkp)!=NULL&&

          current->value<new_value)linkp=&current->link;

    

        //为新节点分配内存,并把新值存储到新节点中,如果内存分配失败,函数返回false;

        new1=(Node *)malloc(sizeof(Node));

        if(new1==NULL)return FALSE;

        new1->value=new_value;

        

        //链表中插入新节点

        new1->link=current;

        *linkp=new1;

    

        return TRUE;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值