c_cpp 使用任意指针指向链接列表中的下一个更高值节点

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp 使用任意指针指向链接列表中的下一个更高值节点相关的知识,希望对你有一定的参考价值。

//https://www.geeksforgeeks.org/point-to-next-higher-value-node-in-a-linked-list-with-an-arbitrary-pointer/
#include <iostream>
#include <list>
using namespace std;

struct linked_list {
    int data;
    struct linked_list *next, *arbit;
};
typedef struct linked_list node;

void print (node *n) {
    while (n) {
        cout<< n->data<< "->";
        n=n->next;
    }
    cout<< "NULL\n";
    return;
}

void printArbit (node *n) {
    while (n) {
        cout<< n->data<< "->";
        n=n->arbit;
    }
    cout<< "NULL\n";
    return;
}

void insert(node **headref, int n) {
    node *temp=(node*)malloc(sizeof(node));
    temp->data=n;
    temp->next=NULL;
    temp->arbit=NULL;
    if (*headref == NULL) {
        *headref = temp;
        return;
    }
    node *last=*headref;
    while (last->next)
        last=last->next;
    last->next=temp;
    return;
}

void insertArbit (node **headref, int n) {
    node *temp=(node*)malloc(sizeof(node));
    temp->data=n;
    temp->next=NULL;
    temp->arbit=NULL;
    if (*headref == NULL) {
        *headref = temp;
        return;
    }
    node *last=*headref;
    while (last->arbit)
        last=last->arbit;
    last->arbit=temp;
    return;
}

void split(node *head, node **aref, node **bref) {
    node *slow=head, *fast=head->arbit;
    while (fast && fast->arbit) {
        fast=fast->arbit;
        if (fast!=NULL) {
            slow=slow->arbit;
            fast=fast->arbit;
        }
    }
    *aref=head;
    *bref=slow->arbit;
    slow->arbit=NULL;
    return;
}

node *merge(node *a, node *b) {
    node *head=NULL;
    while (a&&b) {
        if (a->data < b->data) {
            insertArbit(&head, a->data);
            a= a->arbit;
        }
        else {
            insertArbit(&head, b->data);
            b= b->arbit;
        }
    }
    while (a) {
        insertArbit(&head, a->data);
        a = a->arbit;
    }
    while (b) {
        insertArbit(&head, b->data);
        b = b->arbit;
    }
    return head;
}

void MergeSort (node **headref) {
    node *a, *b, *head=*headref;
    if (head==NULL || head->arbit==NULL)
        return;

    split(head, &a, &b);
    MergeSort(&a);
    MergeSort(&b);
    *headref=merge(a,b);
    return;
}

void ChangeList (node **headref) {
    node *temp=*headref;
    while(temp) {
        temp->arbit=temp->next;
        temp=temp->next;
    }
    MergeSort(headref);
    return;
}

int main() {
    int n;
    node *head=NULL;
    while (true) {
        cout<< "Enter the num: ";
        cin>>n;
        if (n==-9)
            break;
        else
            insert(&head,n);
    }
    print (head);
    ChangeList (&head);
    printArbit(head);

}

以上是关于c_cpp 使用任意指针指向链接列表中的下一个更高值节点的主要内容,如果未能解决你的问题,请参考以下文章

单向链表的简单使用

c_cpp 使用第二级指针删除链接列表节点

JZ-057-二叉树的下一个结点

Go 语言学习数据结构:双链表

删除链表倒数第n个结点

在 C++ 中实现双向链表时面临调试问题