题目描述
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;
}