单向链表之有序插入节点(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;
//-------------------------------------------------------------
结构体节点:
demo:
按特定值插入链表,要求链表本身使用某种排序方法排好序的。
链表的插入分四种情况:
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 } }
相关文章推荐
- C语言实现单向链表及其各种排序(含快排,选择,插入,冒泡)
- C语言实现单向链表及其各种排序(含快排,选择,插入,冒泡)
- C语言实现链表之单向链表(九)在任意位置插入结点
- 单向链表之删除节点(C语言实现)
- C语言实现链表节点的插入和删除
- C语言实现双向链表删除节点、插入节点、双向输出等操作
- 有序双向链表的插入 C语言实现
- 【数据结构】C语言实现链表节点的插入和删除
- C语言实现单链表(不带头结点)节点的插入
- C语言实现双向链表删除节点、插入节点、双向输出等操作
- [原]C语言实现双向链表删除节点、插入节点、双向输出等操作
- 向有序循环单向链表中插入节点
- 实现一个 链表 有序插入新节点
- C语言实现双向非循环链表(带头结点尾结点)的节点插入
- C语言实现链表之单向链表(五)头结点前插入结点
- c语言单向链表的简单实现,隐藏head节点
- 有序插入建立链表 C语言实现
- C语言单向动态链表程序,实现链表的建立,合并,重新排序,链表元素的插入与删除,以及根据元素成员的值进行元素删除。
- C语言实现链表之单向链表(七)尾结点后插入结点
- 【数据结构】C语言实现链表节点的插入和删除