KiKi学结构体和指针


 

题目描述

KiKi学习了结构体和指针,他了解了结构体类型可以定义包含多个不同类型成员,而指针本质是内存地址,是引用数据的另外一种方式。现在他想将多个输入的数据通过结构体和指针的方式连接在一起,形成一个单向链表,即:每个结点是结构体类型,包括整型数据成员(data)和结构体指针类型成员(next),每个结点的指针部分指向下一个输入的结点。具体建立过程如下:先输入n个整数,按照数据输入的顺序建立一个带头结点的单链表,再输入一个数据m,将单链表中的值为m的结点全部删除。输出删除后的单链表信息。

输入描述:

 

包括三行:

第一行输入数据个数n (3≤n≤100);

第二行依次输入n个整数,用空格分隔;

第三行输入欲删除数据m。

输出描述:

 

包括两行:

第一行输出完成删除后的单链表长度;

第二行依次输出完成删除后的单链表数据。

示例1

输入

5
1 2 2 3 4
2

输出

3
1 3 4
#include <iostream>

using namespace std;

// 定义链表结点结构体
struct Node {
    int data;
    Node* next;
};

// 删除链表中值为m的结点
Node* deleteNodes(Node* head, int m) {
    while (head != nullptr && head->data == m) {
        Node* temp = head;
        head = head->next;
        delete temp;
    }

    Node* current = head;

    while (current != nullptr && current->next != nullptr) {
        if (current->next->data == m) {
            Node* temp = current->next;
            current->next = current->next->next;
            delete temp;
        } else {
            current = current->next;
        }
    }

    return head;
}

// 输出链表信息
void printList(Node* head) {
    int length = 0;
    Node* current = head;

    while (current != nullptr) {
        length++;
        current = current->next;
    }

    cout << length << endl;

    current = head;

    while (current != nullptr) {
        cout << current->data << " ";
        current = current->next;
    }

    cout << endl;
}

int main() {
    int n;
    cin >> n;

    // 建立带头结点的单链表
    Node* head = new Node{0, nullptr}; // 头结点

    Node* current = head;

    for (int i = 0; i < n; ++i) {
        int data;
        cin >> data;

        Node* newNode = new Node{data, nullptr};
        current->next = newNode;
        current = newNode;
    }

    int m;
    cin >> m;

    // 删除值为m的结点
    head->next = deleteNodes(head->next, m);

    // 输出删除后的链表信息
    printList(head->next);

    // 释放链表内存
    current = head;
    while (current != nullptr) {
        Node* temp = current;
        current = current->next;
        delete temp;
    }

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山月@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值