c++采用结构体实现链表初始元素的输入、任意位置插入、删除、查找、遍历的功能。自己输入初始元素,通过不同指令输出不同功能
时间: 2023-12-13 11:06:09 浏览: 57
好的,下面是一个简单的例子:
```c++
#include <iostream>
using namespace std;
// 定义结构体Node表示链表节点
struct Node {
int data; // 数据域
Node* next; // 指针域,指向下一个节点
};
// 初始化链表,返回头节点
Node* initList(int n) {
Node* head = new Node;
head->next = nullptr; // 头节点的next指针指向空
Node* p = head; // p指向当前节点,初始时指向头节点
for (int i = 0; i < n; ++i) {
int num;
cin >> num; // 输入每个节点的值
Node* newNode = new Node; // 创建新节点
newNode->data = num;
newNode->next = nullptr;
p->next = newNode; // 当前节点的next指针指向新节点
p = p->next; // p指向新节点,准备处理下一个节点
}
return head;
}
// 在任意位置插入节点
void insertNode(Node* head, int pos, int num) {
Node* p = head;
int i = 0;
// 找到要插入位置的前一个节点
while (p && i < pos-1) {
p = p->next;
++i;
}
if (!p || i > pos-1) {
cout << "插入位置无效" << endl;
return;
}
Node* newNode = new Node; // 创建新节点
newNode->data = num;
newNode->next = p->next; // 新节点的next指针指向插入位置后面的节点
p->next = newNode; // 插入位置前面的节点的next指针指向新节点
}
// 删除节点
void deleteNode(Node* head, int num) {
Node* p = head;
// 找到要删除的节点的前一个节点
while (p->next && p->next->data != num) {
p = p->next;
}
if (!p->next) {
cout << "链表中不存在该元素" << endl;
return;
}
Node* q = p->next; // q指向要删除的节点
p->next = q->next; // 删除节点
delete q;
}
// 查找节点
int findNode(Node* head, int num) {
Node* p = head->next;
int i = 1; // 记录节点位置
while (p && p->data != num) {
p = p->next;
++i;
}
if (!p) {
cout << "链表中不存在该元素" << endl;
return -1;
}
cout << "元素在链表中的位置:" << i << endl;
return i;
}
// 遍历链表
void traverseList(Node* head) {
Node* p = head->next;
while (p) {
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
int main() {
cout << "请输入链表的长度:";
int n;
cin >> n;
Node* head = initList(n); // 初始化链表
while (true) {
int op, pos, num;
cout << "请输入指令:1表示插入节点,2表示删除节点,3表示查找节点,4表示遍历链表,0表示退出程序。" << endl;
cin >> op;
switch (op) {
case 1:
cout << "请输入要插入的位置和数值:";
cin >> pos >> num;
insertNode(head, pos, num);
break;
case 2:
cout << "请输入要删除的数值:";
cin >> num;
deleteNode(head, num);
break;
case 3:
cout << "请输入要查找的数值:";
cin >> num;
findNode(head, num);
break;
case 4:
traverseList(head);
break;
case 0:
return 0;
default:
cout << "无效指令" << endl;
break;
}
}
return 0;
}
```
这个例子实现了链表的初始化、任意位置插入、删除、查找、遍历等功能,可以根据输入的指令进行相应操作。
阅读全文