单向链表之有序插入节点(C语言实现)

链表的创建查看

按特定值插入链表,要求链表本身使用某种排序方法排好序的。

 

链表的插入分四种情况:

1、原链表为空时:使头结点head指向新插入的节点p_new;

 

2、在第一个节点前加入:使头结点head指向新插入的节点p_new,新插入的节点p_new的next指向第一个节点;

3、在中间插入节点:使新加入的节点的前一个节点指向新加入的节点p_new,新加入的节点的next指向前一个节点的next;

4、在末尾插入节点:使末尾节点的next指向新插入的节点p_new,p_new的next指向NULL。


//-------------------------------------------------------------
--1、链表为空:新插入的节点就是头结点

 

*p_head = p_new;
p_new->next = NULL;

--2、链表不为空:
循环查找,首个节点的num比新来的num大,插入到它的前面

 

 

1)找到一个节点的num比新来的num大

 

1.找到的节点是头结点,插在最前面
p_new->next = pb;
*p_head = p_new;
2.插在普通节点的前面(中间位置)
pf->next = p_new;
p_new->next = pb;
2)没有找到一个节点num,比新来的节点的num大,插在后面
pb->next=p_new;
p_new->next = NULL;

//-------------------------------------------------------------

结构体节点:

 

typedef struct student {
    int num;        //学号
    int score;    //分数
    char name[20];
    struct student *next;//指针域
}STU;

demo:

 

void link_insert(STU **p_head, STU *p_new)
{
    STU *pb = NULL, *pf = NULL;
    pf = *p_head;
    if(*p_head == NULL) { // 1.头结点为空,直接插入
        *p_head = p_new;
        p_new->next = NULL;
        return ;
    }

    while((p_new->num >= pf->num) && (pf->next != NULL)){ // 2.遍历
        pb = pf;
        pf = pf->next;
    }

    if(p_new->num < pf->num) {// 3.找到一个pf指向的节点的num比新来的节点的num大,则插到pf节点的前面。
        if(pf == *p_head) {// 3.1.找的节点是头结点,插到对前面
            *p_head = p_new;
            p_new->next = pf;
        } else {// 3.2.找到的是中间节点,插在中间节点pf的前面
            pb->next = p_new;
            p_new->next = pf;
        }
    } else {// 4.没有找到一个节点的num比新来的节点的num大,插在末尾
        pf->next = p_new;
        p_new->next = NULL
    }
}
  • 16
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值