2024王道408数据结构 P39 T20
思考过程
- 首先还是先看题目,这题有一点繁琐,有题意可知我们先要找到data值为x的结点,然后让该结点的f值+1,最后再把它从链表里删除,插入到合适的位置让链表降序排列。
- 明确了题目的意思之后我们先设指针p和q,
struct node *q, *p = L->next;
p用来遍历链表找到值为x的结点,我们直接while (p && p->data != x) p = p->next
,这样让p就直接到找值为x的结点,我们假设链表长这个样子,x为3,如下图所示 - 这时候我们就把值为3的结点的f+1,+1之后我们就可以删除这个结点了,
if (p->next != NULL) p->next->prior = p->prior//如果该结点正好是链表中的最后一个结点时就不用执行这一步 ; p->prior-next = p->next;
这一步就是把该结点删除,之后让q指针指向p的前驱结点,如下图所示 - if判断q指针的f值是否>p指针的f值,如果大于的话就表示p指针指向的结点应该插入在这个位置,如果小于或等于的话就让q指针往前移动
while (q != L && q->f <= p->f) q = q->prior;
这一步是为了让q找到适合p插入的位置。 - 找到适合插入的位置之后就是插入结点了。
最后完整代码附上
//
// Created by 黎圣 on 2023/7/26.
//
#include "iostream"
typedef struct node
{
int data, f;
struct node *next, *prior;
}*linklist;
//我举的例子
int a[5] = {
1,2