一个链表是怎么初始化、插入、删除以及查找的。 输入格式: 输入数据只有一组,有很多行。每行的格式可能是下列一种: insert a name delete name show search name 其中 a 是一个整数,代表在第a个名字前插入名字。name是一个姓名,只包含英文字母的大小写,每个名字不超过30个字符。 输入保证不会插入列表中已经存在的姓名,不会删除列表中不存在的姓名,不会搜索列表中不存在的姓名,也不会要求在非法的位置插入列表。 输出格式: 起始时,列表是空的。只输出show和search name 的结果。show将列表中的姓名全部输出,search只输出找到该名字的序号(从1开始)。每次输出占一行,姓名间用空格隔开。如果列表中没有名字了,show时也要输出一个空行。 输入样例: 在这里给出一组输入。例如: insert 1 Stuart insert 2 Bernadette show search Stuart delete Stuart show insert 2 Stuart show insert 1 Amy insert 2 Leslie insert 3 Stephanie show delete Leslie show search Stuart 输出样例: 在这里给出相应的输出。例如: Stuart Bernadette 1 Bernadette Bernadette Stuart Amy Leslie Stephanie Bernadette Stuart Amy Stephanie Bernadette Stuart 4 提示 1、名字是不含空格的,指令也是一定的,所以可以用scanf("%s", str)来读取。 2、题目要求每个输出占一行,所以要注意换行。 3、输入的行数是不确定的。必须用输入循环来读输入数据。例如 char cmd[10]; while (scanf("%s", cmd) == 1) { //Todo: 此处是你的代码 }
时间: 2023-12-10 07:38:39 浏览: 110
链表的初始化、插入、删除和查找操作如下:
```c++
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
struct Node {
string name;
Node *next;
};
Node *head = nullptr; // 链表头指针
// 初始化链表,创建一个空节点作为头结点
void init() {
head = new Node();
head->next = nullptr;
}
// 在第 a 个名字前插入新的名字
void insert(int a, string name) {
Node *p = head;
for (int i = 1; i < a && p != nullptr; i++) {
p = p->next;
}
Node *newNode = new Node();
newNode->name = name;
newNode->next = p->next;
p->next = newNode;
}
// 删除指定名字的节点
void remove(string name) {
Node *p = head;
while (p->next != nullptr && p->next->name != name) {
p = p->next;
}
if (p->next != nullptr) {
Node *temp = p->next;
p->next = temp->next;
delete temp;
}
}
// 查找指定名字在链表中的位置
int search(string name) {
Node *p = head->next;
int i = 1;
while (p != nullptr && p->name != name) {
p = p->next;
i++;
}
if (p == nullptr) {
return -1; // 没有找到
} else {
return i;
}
}
// 输出链表中所有的名字
void show() {
Node *p = head->next;
while (p != nullptr) {
cout << p->name << " ";
p = p->next;
}
cout << endl;
}
int main() {
init(); // 初始化链表
char cmd[10];
while (scanf("%s", cmd) == 1) {
if (strcmp(cmd, "insert") == 0) {
int a;
string name;
cin >> a >> name;
insert(a, name);
} else if (strcmp(cmd, "delete") == 0) {
string name;
cin >> name;
remove(name);
} else if (strcmp(cmd, "show") == 0) {
show();
} else if (strcmp(cmd, "search") == 0) {
string name;
cin >> name;
int pos = search(name);
if (pos == -1) {
cout << "Not found" << endl;
} else {
cout << pos << endl;
}
}
}
return 0;
}
```
注意事项:
- 链表的初始化需要创建一个空节点作为头结点。
- 插入操作需要先找到第 a 个名字的前一个节点,然后新建一个节点插入到它的后面。
- 删除操作需要先找到指定名字的前一个节点,然后删除它的后继节点。
- 查找操作需要遍历整个链表,找到第一个名字为指定名字的节点,返回它在链表中的位置。
- 需要注意输入格式和输出格式。
阅读全文