您的位置:首页 > 编程语言 > C语言/C++

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

2018-03-20 07:50 483 查看
链表的创建查看

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

链表的插入分四种情况:

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
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: