用c++实现单链表的头插法建表、尾插法建表、输出数据元素、按位查找、按值查找、插入数据元素、删除数据元素的操作,包含主函数,完整程序
时间: 2024-09-22 14:10:23 浏览: 51
C++单链表的创建方法
在C++中,我们可以使用结构体(struct)和指针来实现单链表。这里提供一个简单的示例,展示了如何完成你提到的各种操作:
```cpp
#include <iostream>
// 定义链表节点
struct Node {
int data;
Node* next;
};
// 创建新节点并头插法添加到链表
Node* insertAtHead(int value) {
Node* newNode = new Node();
newNode->data = value;
newNode->next = nullptr; // 新节点默认指向空
if (head == nullptr) { // 如果链表为空,新节点既是头也是尾
head = newNode;
} else {
newNode->next = head; // 将新节点的next指向当前头节点
head = newNode; // 更新头节点
}
return newNode;
}
// 创建新节点并尾插法添加到链表
Node* insertAtTail(int value) {
Node* newNode = new Node();
newNode->data = value;
newNode->next = nullptr;
if (head == nullptr) { // 链表为空时
head = newNode;
} else {
Node* temp = head;
while (temp->next != nullptr) {
temp = temp->next;
}
temp->next = newNode; // 将最后节点的next指向新节点
}
return newNode;
}
// 输出链表数据
void printList(Node* node) {
while (node != nullptr) {
std::cout << node->data << " ";
node = node->next;
}
std::cout << "\n";
}
// 按位查找(仅适用于整数)
bool binarySearch(Node* start, int key) {
Node* current = start;
int size = 0;
while (current != nullptr) {
++size;
current = current->next;
}
for (int i = 0; i < size / 2; ++i) {
if (start->data & (1 << i)) {
if ((key & (1 << i)) != 0) {
return true; // 找到了一个匹配位置
} else {
break; // 键的位置小于当前索引,继续右移
}
} else {
if ((key & (1 << i)) == 0) {
continue; // 键的位置大于等于当前索引,继续左移
} else {
return false; // 找不到匹配位置
}
}
}
return key == start->data; // 如果遍历完仍未找到匹配,则键位于最左边
}
// 按值查找
Node* searchByValue(Node* node, int value) {
while (node != nullptr) {
if (node->data == value) {
return node;
}
node = node->next;
}
return nullptr; // 如果未找到,返回nullptr
}
// 插入数据元素
Node* insertElementAtPosition(Node* node, int position, int value) {
Node* newNode = new Node{value, nullptr};
if (position == 0) {
newNode->next = head;
head = newNode;
} else {
Node* temp = head;
for (int i = 0; i < position - 1 && temp != nullptr; ++i) {
temp = temp->next;
}
if (temp != nullptr) {
newNode->next = temp->next;
temp->next = newNode;
} else {
std::cerr << "Invalid position\n"; // 如果插入位置超出链表长度,则报错
delete newNode;
newNode = nullptr;
}
}
return newNode;
}
// 删除数据元素
Node* deleteElement(Node* head, int value) {
if (head == nullptr) return head;
if (head->data == value) {
Node* temp = head;
head = head->next;
delete temp;
return head;
}
Node* curr = head;
while (curr->next != nullptr && curr->next->data != value) {
curr = curr->next;
}
if (curr->next != nullptr) {
Node* toDelete = curr->next;
curr->next = curr->next->next;
delete toDelete;
}
return head;
}
int main() {
Node* head = nullptr;
// 测试各种操作
head = insertAtHead(1);
head = insertAtTail(5);
printList(head); // 输出: 1 5
Node* foundNode = searchByValue(head, 5);
if (foundNode) {
std::cout << "Found: " << foundNode->data << "\n";
} else {
std::cout << "Not found.\n";
}
// 更多操作...(此处省略)
return 0;
}
```
这个程序实现了链表的基本操作,包括头插法、尾插法构建链表,以及查找、插入和删除数据元素。你可以根据需要扩展主函数部分,对链表进行更多的操作。
阅读全文