初学者有点成就感嘛
#include <iostream>
using namespace std;
struct Node{
int data;
Node* next;
};
//在链表的尾部插入一个节点
Node* appendNode(Node* LinkedListNode, int data){
//这里要求传入的LinkedListNode只要是链表中的任意一个节点
//传入头节点当然是最方便的,但是这样需要遍历整个链表才能添加上节点。
//如果知道当前链表的最后一个节点当然是最方便的
Node* newNode = new struct Node;
while(LinkedListNode->next != nullptr){
LinkedListNode = LinkedListNode->next;
}
LinkedListNode->next = newNode;
newNode->next = nullptr;
newNode->data = data;
return newNode; //最后将新节点的地址返回出去
}
//在链表的任意位置插入一个节点
void insertNode(Node* headNode, int index, int data){
//headNode是指向存放数据头节点的指针,本身不存放数据
Node* newNode = new Node;
newNode->data = data;
newNode->next = nullptr;
//永远记住,优先处理最特殊的情况
if(index == 0){
newNode->next = headNode->next;
headNode->next = newNode;
return;
}
Node* temp = headNode; //由于要反复修改节点数据,避免对头节点修改,采用临时变量
for(int i = 0; i < index; ++i){
if(temp->next == nullptr){
cout << "Invalid insert, please check your index!" << endl;
return;
}
temp = temp->next;
}
newNode->next = temp->next;
temp->next = newNode;
}
void PrintLinkedList(Node* headNode){
Node* temp = headNode;
while(temp->next != nullptr){
temp = temp->next;
cout << temp->data << ' ';
}
cout << endl;
}
int main(){
struct Node head; //这是链表的唯一标识,它不用于存储数据,只用来存储链表头节点的位置
//请注意,直接声明一根指针是不会分配任何内存空间的,你无法对这根空指针进行访问,除了赋值
head.next = nullptr;
int index; int number;
while(true){
cout << "Insert(index, number)\nindex = ";
cin >> index;
cout << "number = ";
cin >>number;
if(index == -1){
break;
}
insertNode(&head, index, number);
PrintLinkedList(&head);
}
return 0;
}