首页 > 其他分享 >链表2: 动态单链表

链表2: 动态单链表

时间:2024-04-13 22:01:48浏览次数:30  
标签:pCurrent 单链 LNode val next 链表 header 动态

链表2: 动态单链表


定义数据结构

// 定义链表数据结构
typedef struct LNode{
    int data;
    struct LNode *next;
}LNode;

初始化链表

// 初始化链表
LNode *Init_LinkList(){ //返回头指针
    // 创建头结点
    LNode *header = (LNode*)malloc(sizeof(LNode));
    header->data = -1;
    header->next = NULL;
    // 创建尾部指针
    LNode *pEnd = header;
    // 插入数据
    int val = -1;
    while(true){
        cout << "input value: ";
        cin >> val;
        // 判断输入结束
        if(val==-1){
            cout << "input end" << endl;
            break;
        }
        // 创建新节点
        LNode *newNode = (LNode*)malloc(sizeof(LNode));
        newNode->data = val;
        newNode->next = NULL;
        // 将新节点放入链表中
        pEnd->next = newNode;
        // 更新尾部指针指向
        pEnd = newNode;
    }
    // 返回头指针
    return header;
}

通过值删除结点

// 删除值为val的节点
void deleteValue(LNode *header){
    if(!header->next) return;
    LNode *preNode = header;
    LNode *pCurrent = preNode->next;

    int val;
    cout << "input val: ";
    cin >> val;

    while(pCurrent){
        if(pCurrent->data==val) break;
        preNode = pCurrent;
        pCurrent = preNode->next;
    }

    if(!pCurrent){
        cout << "Node doesn't exist" << endl;
        return;
    } 

    // 如果值相等,将当前前趋的next指向当前后继的地址
    preNode->next = pCurrent->next;
    // // 将当前next指向null
    // pCurrent->next = NULL;
    // 释放当前结点
    free(pCurrent);
}

在链表的末尾插入新数据


输出链表

// 遍历
void ForeachValue(LNode *header){
    // 空表
    if(!header->next) {
        cout << "null" << endl;
        return;
    }            
    // 第一个元素无需遍历
    LNode *pCurrent = header->next;
    while(pCurrent){
        cout << pCurrent->data << endl;
        pCurrent = pCurrent -> next;
    }
}

清空链表

//(保留了头指针)
void Clear_LinkList(LNode *header){
    if(!header) return; // 空链表
    LNode *pCurrent = header->next;
    while(pCurrent){
        LNode *pBackup = pCurrent->next;
        free(pCurrent);
        pCurrent = pBackup;
    }
    header->next = NULL;
}

销毁链表

// 销毁
void Destory_LinkList(LNode *header){
    if(!header) return; // 如果链表为空
    LNode *pCurrent = header;
    while(pCurrent){
        LNode *pBackup = pCurrent->next;
        cout << pCurrent->data << " Node was destoried" << endl;
        free(pCurrent);
        pCurrent = pBackup;
    }
    free(header);
}

测试

int main(){
    LNode *header = Init_LinkList();
    ForeachValue(header); //遍历
    insertValue(header); //插入数据
    ForeachValue(header);
    // // 清空
    // Clear_LinkList(header);
    deleteValue(header);
    ForeachValue(header);

    Destory_LinkList(header);

    system("pause");
    return 0;
}

标签:pCurrent,单链,LNode,val,next,链表,header,动态
From: https://www.cnblogs.com/HIK4RU44/p/18133446

相关文章

  • 链表1: 静态单链表
    链表1:静态单链表单链表的结构链表包含了数据域与指针域,数据域存储数据,指针域存储下一个结点的地址链表的特点链表的优势在于数据的删改,在链表中查询第$i$个元素需要从第一个结点开始遍历链表,,因此在数据的顺序读取中链表的优势不如数组.链表的插入操作设newN......
  • JZ76 删除链表中重复的节点
    1、相似题classSolution{public:ListNode*deleteDuplicates(ListNode*head){//判空if(head==NULL)returnnullptr;ListNode*p1=head;ListNode*p2=p1->next;while(p2){......
  • 数据结构-链表
    数据结构-链表1.链表的基本概念:链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据和指向列表中下一个节点的引用(或指针)。2.单向链表:单向链表的每个节点只有一个指向下一个节点的链接。这种结构使得遍历只能单向进行,从头节点开始到尾节点结束。classNode:d......
  • JZ22 链表中倒数最后k个节点
    /***structListNode{* intval;* structListNode*next;* ListNode(intx):val(x),next(nullptr){}*};*/classSolution{public:/***代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可***@param......
  • JZ52 两个链表的第一个公共节点
    /*structListNode{ intval; structListNode*next; ListNode(intx): val(x),next(NULL){ }};*/#include<endian.h>classSolution{public: //返回类型为节点指针类型,传入的是两个链表的头节点ListNode*FindFirstCommonNode(ListNode*pHead1,......
  • Protobuf_动态消息-反射
    protobufprotoc版本协议文件版本message消息中承载的数据分别对应于每一个字段都有一个名字和一种类型optionalrepeated:在格式正确的消息中,此字段类型可以重复零次或多次。系统会保留重复值的顺序字段规则字段类型字段名称=字段编号[default=0];......
  • 动态规划
    1、动态规划概述动态规划是一种解决多阶段决策问题的数学优化方法。它将原问题分解成若干个子问题,通过解决子问题只需解决一次并将结果保存下来,从而避免了重复计算,提高了算法效率。通俗来讲,动态规划算法是解决一类具有重叠子问题和最优子结构性质的问题的有效方法。其基本原理......
  • MyBatis动态SQL
    MyBatis动态SQL动态SQL简介动态SQL是MyBatis的强大特性之一。如果你使用过JDBC或其它类似的框架,你应该能理解根据不同条件拼接SQL语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态SQL,可以彻底摆脱这种痛苦。使用动态......
  • BM2 链表内指定区间反转
    代码有点长,但是我比较喜欢这种做法。注意的点是如果第一个参与了反转,那么返回的就是区间反转之后的头结点,而不是原始头结点。importjava.util.*;/**publicclassListNode{*intval;*ListNodenext=null;*publicListNode(intval){*this.val=......
  • BM1 反转链表
    开始刷数据结构了。1.递归importjava.util.*;/**publicclassListNode{*intval;*ListNodenext=null;*publicListNode(intval){*this.val=val;*}*}*/publicclassSolution{publicListNodeReverseList(ListNodehea......