单链表的基本操作。
```c++
#include<iostream>
using namespace std;
class node {//单链表的数据结构 包括数据域和next指针域
public:
int val;
node* next;
};
node* head = new node;
void init() {
head->next = nullptr;
}
node* creatFromHead(node* head) {//头插法建立 缺点是链表顺序与输入顺序相反 不太好
int x; cin >> x;
while(x!=1234565432) {
node* p = new node;
p->val = x;
p->next = head->next;
head->next = p;
cin >> x;
}
return head;
}
node* creatFromTail(node* head) {//尾插法 链表顺序与插入顺序相同 头指针的数据域也储存了值
int x; cin >> x;
node* s = new node;
s = head;
while (true) {
node* p = new node;
head->next = p;
head->val = x;
cin >> x;
if (x == 88) break;
head = head->next;
}
head->next = nullptr;
return s;
}
node* findByIndex(node* head, int index) {//头的序号是0;如果是头插法i从1开始,如果是尾插法i从0开始 按位置查找
if (!head || index < 0) return nullptr;
int i = 0;
while (head) {
if (i == index) return head;
i++; head = head->next;
}
return nullptr;
}
node* findByVal(node* head, int elm) {//按值查找 如果头插法建立链表 创建一个p指向head->next,循环条件改为p->next;
if (!head) return head;
while (head) {
if (head->val == elm) return head;
head = head->next;
}
return nullptr;
}
bool insert(node* head, int index, int elm) {//在index位置后面插入数据域为elm的节点
if (!head || index < 0) return false;
node* tar = findByIndex(head, index);
if (!tar) return false;
node* s = new node;
s->val = elm;
s->next = tar->next;
tar->next = s;
return true;
}
bool deleteByIndex(node*head,int index){//删除第i个节点
if (!head || index < 0) return false;
node* tar = findByIndex(head, index-1);
if (!tar) return false;
tar->next = tar->next->next;
return true;
}
bool deleteByVal(node* head, int elm) {//删除第一个值为elm的节点
if (!head) return false;
int index = 0;
node* new_head = head;
while (head->val != elm) head=head->next,index++;
node*tar=findByIndex(new_head, index - 1);
if (!tar) return false;
tar->next = tar->next->next;
return true;
}
void printNode(node* head) {
while (head) {
cout << head->val<<" ";
head = head->next;
}
cout << endl;
}
int main() {
init();
node*p=creatFromTail(head);
printNode(head);
node* test = findByIndex(head, 3);
printNode(test);
node* test02 = findByVal(head, 5);
printNode(test02);
insert(head, 2, 1000);
printNode(head);
deleteByIndex(head, 4);
printNode(head);
deleteByVal(head, 123);
printNode(head);
return 0;
}
```
测试结果如图所示,采用类似于尾插法的方法,链表顺序与插入顺序是相同的,头节点也保存了值,所以测试时链表序号为头节点为0,然后依次为1,2,3,4......