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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/peng_apple/article/details/79614764

链表的创建查看

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

链表的插入分四种情况:

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
    }
}

猜你喜欢

转载自blog.csdn.net/peng_apple/article/details/79614764
今日推荐