链表的系列操作

本文介绍了如何使用C++实现链表的创建、插入、删除以及遍历功能,包括使用结构体定义节点、动态内存分配和指针操作。
摘要由CSDN通过智能技术生成

 c++:

// 链表的系列操作  
#include <bits/stdc++.h> // 包含标准库中的所有头文件,但不建议在正式项目中使用  
  
using namespace std; // 使用标准命名空间  
  
// 定义链表节点结构  
struct Node {  
    int data; // 节点数据  
    struct Node* next; // 指向下一个节点的指针  
};  
  
// 创建链表  
struct Node* creat_link(struct Node* head) {  
    // 注意:这里创建的head节点并没有被使用,而是被新的头节点覆盖了  
    head = (struct Node*)malloc(sizeof(struct Node)); // 分配头节点内存  
    head->next = NULL; // 初始化头节点的next指针为NULL  
    struct Node *tail = head; // 尾指针初始化为头节点  
    for(int i = 1; i <= 10; i++) {  
        struct Node *temp = (struct Node*)malloc(sizeof(struct Node)); // 分配新节点内存  
        temp->data = i; // 设置新节点的数据  
        temp->next = NULL; // 初始化新节点的next指针为NULL  
        tail->next = temp; // 将新节点添加到链表末尾  
        tail = temp; // 更新尾指针  
    }  
    return head; // 返回链表的头节点  
}  
  
// 遍历链表  
void print_link(struct Node* head) {  
    // 注意:这里直接修改了head指针,可能会丢失头节点,但在这个函数中只是遍历  
    head = head->next; // 跳过头节点(假头),开始遍历  
    while(head) {  
        cout << head->data << endl; // 输出当前节点的数据  
        head = head->next; // 移动到下一个节点  
    }  
}  
  
// 删除某个元素  
void delete_node(struct Node* head, int value) {  
    if (head == NULL || head->next == NULL) {  
        // 如果链表为空或只有一个节点(即假头),则无法删除  
        return;  
    }  
    struct Node* prev = head; // prev用于记录当前节点的前一个节点  
    struct Node* current = head->next; // current用于遍历链表  
      
    while(current != NULL) {  
        if(current->data == value) {  
            // 如果找到了要删除的节点  
            prev->next = current->next; // 将前一个节点的next指针指向当前节点的下一个节点  
            free(current); // 释放当前节点的内存  
            return; // 删除成功,返回  
        }  
        prev = current; // 移动prev和current到下一个节点  
        current = current->next;  
    }  
    // 如果遍历完整个链表都没有找到要删除的节点,则不执行任何操作  
}  
  
int main() {  
    struct Node *head = NULL; // 初始化头指针为NULL  
    head = creat_link(head); // 创建链表  
    delete_node(head, 5); // 删除值为5的节点  
    print_link(head); // 遍历并打印链表  
  
    // 注意:在真实情况下,应该释放整个链表的内存,但这里为了简洁省略了  
    return 0;  
}

c语言: 

#include <stdio.h>
#include <stdlib.h>

// 定义链表节点结构
typedef struct Node {
    int data; // 节点数据
    struct Node* next; // 指向下一个节点的指针
} Node;

// 创建链表
Node* create_link() {
    Node *head = (Node*)malloc(sizeof(Node)); // 分配头节点内存
    head->next = NULL; // 初始化头节点的next指针为NULL
    return head; // 返回链表的头节点
}

// 在链表中插入元素
void insert_node(Node* head, int value) {
    Node *temp = (Node*)malloc(sizeof(Node)); // 分配新节点内存
    temp->data = value; // 设置新节点的数据
    temp->next = NULL; // 初始化新节点的next指针为NULL
    head->next = temp; // 将新节点添加到链表末尾
    head = temp; // 更新尾指针
}

// 遍历链表
void print_link(Node* head) {
    head = head->next; // 跳过头节点(假头),开始遍历
    while(head) {
        printf("%d", head->data); // 输出当前节点的数据
        head = head->next; // 移动到下一个节点
    }
}

// 删除某个元素
void delete_node(Node* head, int value) {
    if (head == NULL || head->next == NULL) {
        // 如果链表为空或只有一个节点(即假头),则无法删除
        return;
    }
    Node* prev = head; // prev用于记录当前节点的前一个节点
    Node* current = head->next; // current用于遍历链表

    while(current != NULL) {
        if(current->data == value) {
            // 如果找到了要删除的节点
            prev->next = current->next; // 将前一个节点的next指针指向当前节点的下一个节点
            free(current); // 释放当前节点的内存
            return; // 删除成功,返回
        }
        prev = current; // 移动prev和current到下一个节点
        current = current->next;
    }
    // 如果遍历完整个链表都没有找到要删除的节点,则不执行任何操作
}

int main() {
    Node *head = create_link(); // 创建链表
    insert_node(head, 1); // 插入元素1
    insert_node(head, 2); // 插入元素2
    insert_node(head, 3); // 插入元素3
    print_link(head); // 遍历并打印链表

    // 注意:在真实情况下,应该释放整个链表的内存,但这里为了简洁省略了
    return 0;
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值