裸指针对链表的相关操作

struct Node
{
    int value      = 0;
    Node* next = nullptr;
    Node(int value_) : value(value_) {}
};

Node* createLinkList(const std::vector<int>& data)
{
    if (data.empty()) {
        return nullptr;
    }
    auto head = new Node(data.front());
    Node* tail = head;
    std::for_each(data.cbegin() + 1, data.cend(),
        [&](int value)
    {
        tail->next = new Node(value);
        tail = tail->next;
    });
    return head;
}

void printLinkList(Node* head)
{
    while (head) {
        std::printf("%d ", head->value);
        head = head->next;
    }
}

void destroyLinkList(Node* head)
{
    if (head == nullptr) {
        return;
    }
    if (head->next) {
        destroyLinkList(head->next);
    }
    delete head;
}

Node* reverseLinkList(Node* old_head)
{
    Node* new_head = nullptr;
    while (old_head) {
        Node* next = old_head->next;
        old_head->next = new_head;
        new_head = old_head;
        old_head = next;
    }
    return new_head;
}

Node* removeDuplicates(Node* head)
{
    if (head == nullptr){
        return head;
    }
    for (auto it = head; it->next;){
        if (it->value == it->next->value){
            Node* next = it->next->next;
            delete it->next;
            it->next = next;
        }else{
            it = it->next;
        }
    }
    return head;
}

void moveHead(Node** dest_ref, Node** source_ref)
{
    auto new_head  = *source_ref;
    *source_ref    = new_head->next;
    new_head->next = *dest_ref;
    *dest_ref      = new_head;
}

void sortedInsert(Node** head_ref, Node* new_node)
{
    Node** current_ref = head_ref;
    while ((*current_ref != nullptr) &&
           (*current_ref)->value < new_node->value){
        current_ref = &((*current_ref)->next);
    }
    new_node->next = *current_ref;
    // 前一个结点保存的地址和当前结点的二级指针的解引用是同一个,
    // 都是 *current_node
    *current_ref   = new_node;
}

void insertSort(Node** head_ref)
{
    Node* new_head = nullptr;
    // 如果 for 的第三段使用 it = it->next,是不是一样呢?
    // 当然不是,因为此时的 it 已经被移动了,所以此时的 it 是在新的链表中,
    // it->next 得到的是新链表中的 next Node.
    // 所以要在 it 移动之前保留一份移动前的 next.
    for(Node* it = *head_ref, *next; it; it = next){
        next = it->next;
        sortedInsert (&new_head, it);
    }
    *head_ref = new_head;
}
时间: 2024-11-10 20:49:13

裸指针对链表的相关操作的相关文章

单链表的相关操作

#ifndef _SLIST_H #define _SLIST_H #ifdef __cplusplus extern "C" { #endif /*******1. 不带头结点的单链表*****/ /***** *@链表结点结构定义 *@ m_data:数据 *@m_pNext:指向下一结点的指针 ***/ struct listNode { int m_data; listNode* m_pNext; }; /******* *@ 用数组array初始化链表,数组元素个数为n *@

链表的相关操作

#include<iostream> using namespace std; struct node { int data; node *next; }; //链表的建立,创建有n个结点的链表 node *create(int n) { node *head=NULL; node *p=NULL; head=new node(); p=head; cin>>p->data; node *q; while(--n) { q=new node(); cin>>q-&

指针、链表的原理和各类操作相关心得以及学生信息管理系统

伴随着学期末的到来,C语言程序设计这门课也接近尾声.经过前两次的教学,我们对C语言也有了深刻的了解,学习的内容也不断的加深.这次我们就学习了C语言程序设计里应用最广泛,也是最难学习的知识--链表和指针的应用. 关于指针和链表这两个的应用和上次的管理系统有着直接的关系,没有添加链表和指针的管理系统无法做到精确的查找.数据存储方面也显得不方便.所以指针和链表的作用能够直接指向你所需要的数据地址,使程序更加完善.这次我就利用指针的应用制作了一个管理员工工资等信息的程序. §1 指向结构体变量的指针变量

就C语言的指针、链表的原理和各类操作撰写一篇技术博客,说说自己学习C语言指针和链表的体会

一.指向结构体变量的指针变量 指向结构体变量的指针变量的定义形式与一般指针变量的定义形式相同,只是将其指向类型定义为结构体类型即可.例如:        struct person            { charname[20];             char sex;             int age;             float height;            };       struct person *p;则指针变量p,它可以指向struct person类

C语言指针和链表的体会

一.指向结构体变量的指针变量 指向结构体变量的指针变量的定义形式与一般指针变量的定义形式相同,只是将其指向类型定义为结构体类型即可.例如:        struct person            { charname[20];             char sex;             int age;             float height;            };       struct person *p;则指针变量p,它可以指向struct person类

广义表——头尾链表存储表示的定义与相关操作

1 /**************************************************** 2 * * 3 * 文件夹: ▲05 数组和广义表\05 GeneralizedList-H&T * 4 * * 5 * 文件名: GeneralizedList-H-T.h * 6 * * 7 * 内 容: 广义表(头尾链表存储表示)相关操作列表 * 8 * * 9 ****************************************************/ 10 11

C语言复习——指针 链表 与 文件操作

刚刚进入大二,准备开始学习C++,对大一所学的C语言一次练习,正好也是赶上老师布置的任务,用C语言写一个  销售管理系统  ,就尽可能的把所学的都用上,也就是结构,指针,文件操作,还有数据结构,本次加入了链表. 用两个函数 Load_LinkList() 和 Save_LinkList() 让链表与文件操作结合,除了打印函数,其他都是在内存中操作链表,这样写更有条理,在创建链表时没有采用书上的用一个中间变量引导,并插入到结点前面,而是直接在链表尾的next申请内存,便于理解,操作也方便. /*首

关于C语言的指针、链表的原理和各类操作

今天课上我们老师为我们讲述了c语言的指针.链表的原理以及各类操作. 一.指针 1.指针 指针是一个存储计算机内存地址的变量.从指针指向的内存读取数据称作指针的取值.指针可以指向某些具体类型的变量地址,例如int.long和double.指针也可以是void类型.NULL指针和未初始化指针.指针是一个存储计算机内存地址的变量.从指针指向的内存读取数据称作指针的取值.指针可以指向某些具体类型的变量地址,例如int.long和double.指针也可以是void类型.NULL指针和未初始化指针. 2.数

双链表(非循环)相关操作:创建、析构、删除、冒泡排序

struct dulnode { int val; dulnode *pre; dulnode *next; }; //这里创建的不是双循环链表 dulnode* create_dulnode(int n) { if (n <= 0) return NULL; int i = 0; dulnode *head, *p1, *p2; //生成头节点 head = new dulnode; head->val = rand() % RAND_MAX; head->pre = NULL; //