用c++写一段代码,用链表来存储数据,链表的三个数据域分别为任意菜品名称和任意时间和用数组存放的从1开始的编号,将相邻的且菜品名称相同的结点的时间相加形成新的结点,删除原来结点,最后输出每个结点的每个数据域
时间: 2023-11-28 17:47:44 浏览: 92
C++链表存储和输出
下面是一份使用 C++ 编写的代码,实现了上述要求的功能:
```c++
#include <iostream>
#include <string>
#include <vector>
using namespace std;
struct Node {
string name;
int time;
int id;
Node* next;
};
void addNode(Node*& head, string name, int time, int id) {
Node* newNode = new Node;
newNode->name = name;
newNode->time = time;
newNode->id = id;
newNode->next = NULL;
if (head == NULL) {
head = newNode;
} else {
Node* curr = head;
while (curr->next != NULL) {
curr = curr->next;
}
curr->next = newNode;
}
}
void removeNode(Node*& head, Node* node) {
if (head == node) {
head = node->next;
} else {
Node* curr = head;
while (curr->next != node) {
curr = curr->next;
}
curr->next = node->next;
}
delete node;
}
void mergeNodes(Node*& head) {
if (head == NULL) {
return;
}
Node* curr = head;
while (curr != NULL && curr->next != NULL) {
if (curr->name == curr->next->name) {
curr->time += curr->next->time;
removeNode(head, curr->next);
} else {
curr = curr->next;
}
}
}
void printNodes(Node* head) {
Node* curr = head;
while (curr != NULL) {
cout << curr->id << " " << curr->name << " " << curr->time << endl;
curr = curr->next;
}
}
int main() {
vector<string> dishes = { "dish1", "dish2", "dish3", "dish1", "dish2", "dish4" };
vector<int> times = { 10, 20, 30, 5, 15, 25 };
Node* head = NULL;
for (int i = 0; i < dishes.size(); i++) {
addNode(head, dishes[i], times[i], i + 1);
}
mergeNodes(head);
printNodes(head);
return 0;
}
```
这个代码定义了一个 `Node` 结构体,表示链表中的一个节点。每个节点有三个数据域:`name` 表示菜品名称,`time` 表示时间,`id` 表示从 1 开始的编号。`addNode` 函数用于向链表中添加一个节点,`removeNode` 函数用于删除一个节点,`mergeNodes` 函数用于将相邻的、且菜品名称相同的节点合并,`printNodes` 函数用于输出链表中所有节点的数据域。
在主函数中,我们使用了两个向量 `dishes` 和 `times`,分别表示菜品名称和时间。我们遍历这两个向量,将每个菜品名称、时间和编号添加到链表中。然后调用 `mergeNodes` 函数将相邻的、且菜品名称相同的节点合并,最后调用 `printNodes` 函数输出链表中所有节点的数据域。
阅读全文