c++结构体链表
当在C++中使用结构体(struct)实现链表时,可以按照以下步骤进行:
首先,定义一个表示链表节点的结构体。结构体应该包含一个数据成员来存储节点的值,以及一个指向下一个节点的指针。
struct Node { int data; Node* next; };
然后,可以创建一个链表类,其中包含用于操作链表的各种方法,例如插入节点、删除节点和打印链表等。
class LinkedList { private: Node* head; // 链表头节点指针 public: LinkedList() { head = nullptr; // 初始化链表为空 } // 在链表末尾插入节点 void insert(int value) { Node* newNode = new Node; // 创建新节点 newNode->data = value; newNode->next = nullptr; if (head == nullptr) { head = newNode; } else { Node* current = head; while (current->next != nullptr) { current = current->next; } current->next = newNode; } } // 打印链表 void print() { Node* current = head; while (current != nullptr) { cout << current->data << " "; current = current->next; } cout << endl; } // 删除指定值的节点 void remove(int value) { if (head == nullptr) { return; } if (head->data == value) { Node* temp = head; head = head->next; delete temp; return; } Node* current = head; while (current->next != nullptr) { if (current->next->data == value) { Node* temp = current->next; current->next = current->next->next; delete temp; return; } current = current->next; } } };
使用这个链表类,可以创建链表对象并调用方法来操作链表。
int main() { LinkedList list; list.insert(5); list.insert(10); list.insert(15); list.insert(20); list.print(); // 输出: 5 10 15 20 list.remove(10); list.print(); // 输出: 5 15 20 return 0; }
这是一个简单的示例,演示了如何使用结构体实现链表以及如何进行插入、删除和打印操作。你可以根据需要扩展链表类的功能。
下面的方法只用结构体不用类?
如果只想使用结构体而不使用类来实现链表,可以将链表操作封装在一组函数中,而不是封装在类的成员函数中。以下是一个使用结构体的链表示例:
#include <iostream> using namespace std; struct Node { int data; Node* next; }; // 在链表末尾插入节点 void insert(Node** head, int value) { Node* newNode = new Node; // 创建新节点 newNode->data = value; newNode->next = nullptr; if (*head == nullptr) { *head = newNode; } else { Node* current = *head; while (current->next != nullptr) { current = current->next; } current->next = newNode; } } // 打印链表 void print(Node* head) { Node* current = head; while (current != nullptr) { cout << current->data << " "; current = current->next; } cout << endl; } // 删除指定值的节点 void remove(Node** head, int value) { if (*head == nullptr) { return; } if ((*head)->data == value) { Node* temp = *head; *head = (*head)->next; delete temp; return; } Node* current = *head; while (current->next != nullptr) { if (current->next->data == value) { Node* temp = current->next; current->next = current->next->next; delete temp; return; } current = current->next; } } int main() { Node* head = nullptr; insert(&head, 5); insert(&head, 10); insert(&head, 15); insert(&head, 20); print(head); // 输出: 5 10 15 20 remove(&head, 10); print(head); // 输出: 5 15 20 return 0; }
在这个示例中,我们使用结构体 Node
来表示链表节点,并且使用指向指针的指针 Node**
来传递链表头节点的引用。通过这种方式,我们可以修改链表的头节点,而不仅仅是在函数内部进行修改。
我们定义了 insert
函数来在链表末尾插入节点,print
函数用于打印链表,remove
函数用于删除指定值的节点。
通过在主函数中调用这些函数,我们可以创建并操作链表。
请注意,在使用结构体而不是类时,我们需要手动管理内存,包括分配和释放节点的内存。在实际应用中,请确保适当地释放链表节点的内存,以避免内存泄漏。
在C++中,结构体可以包含成员函数,因此可以将链表操作函数封装为结构体的成员函数。以下是一个使用结构体的链表示例,其中包含结构体内部的成员函数:
#include <iostream> using namespace std; struct Node { int data; Node* next; // 在链表末尾插入节点 void insert(int value) { Node* newNode = new Node; // 创建新节点 newNode->data = value; newNode->next = nullptr; if (next == nullptr) { next = newNode; } else { Node* current = next; while (current->next != nullptr) { current = current->next; } current->next = newNode; } } // 打印链表 void print() { Node* current = next; while (current != nullptr) { cout << current->data << " "; current = current->next; } cout << endl; } // 删除指定值的节点 void remove(int value) { if (next == nullptr) { return; } if (next->data == value) { Node* temp = next; next = next->next; delete temp; return; } Node* current = next; while (current->next != nullptr) { if (current->next->data == value) { Node* temp = current->next; current->next = current->next->next; delete temp; return; } current = current->next; } } }; int main() { Node head; head.insert(5); head.insert(10); head.insert(15); head.insert(20); head.print(); // 输出: 5 10 15 20 head.remove(10); head.print(); // 输出: 5 15 20 return 0; }
在这个示例中,我们将链表操作函数 insert
、print
和 remove
定义为结构体 Node
的成员函数。因此,你可以通过链表的头节点来调用这些函数。
在主函数中,我们创建了头节点 head
,然后使用头节点调用成员函数来操作链表。
请注意,成员函数可以直接访问结构体的成员变量,因此在这个示例中,我们可以直接访问结构体的 next
成员来表示链表的下一个节点。
这种方法使得链表操作更紧凑,将链表的数据和操作封装在一个结构体中,提供了更直接的方式来操作链表。

- 上一篇:迭代器到底是什么?为什么还有类型?
- 下一篇:C++用类实现链表