链表的创建查看
按特定值插入链表,要求链表本身使用某种排序方法排好序的。
链表的插入分四种情况:
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
}
}
本文介绍了一种在已排序链表中插入新节点的方法。该方法确保插入后链表仍保持有序状态。文章详细解释了四种不同的插入情况,并提供了具体的实现步骤。
&spm=1001.2101.3001.5002&articleId=79614764&d=1&t=3&u=c7ee35450d6749d9b49e35297db04748)
1520

被折叠的 条评论
为什么被折叠?



