#include <iostream>
using namespace std;
struct Node //创建结构体
{
int data;
Node* next;
};
Node* creat_list() { //创建链表头
Node* head = (Node*)malloc(sizeof(Node));
if (head)
{
head->next = nullptr;
}
return head;
}
//从头部插入数据
void insert_front(Node* headNode,const int &data) {
Node* newNode = (Node*)malloc(sizeof(Node));
if (newNode)
{
newNode->data = data;
newNode->next = headNode->next;
headNode->next = newNode;
}
}
//从尾部插入数据
void pushBack(Node* head, const int& data) {
Node* move = head;
//用结构体中next指针为空作为判断条件,则可以获得这个节点本身,
//如果用节点本身,会循环到空指针,注意这一点。
//同理,再获取数据元素时,相同
while (move->next != nullptr)
{
move = move->next;
}
Node* newnode = (Node*)malloc(sizeof(Node));
if (newnode)
{
newnode->data = data;
newnode->next = nullptr;
move->next = newnode;
}
}
//按顺序插入节点
void rankNode(Node* head, const int& data)
{
//类似于删除节点的操作,定义两个指针,相互递进
Node* findNode = head->next;
Node* frontNode = head;
if (findNode == nullptr) //判断节点是否为空
{
cout << "节点为空,请插入节点" << endl;
return;
}
else
{
while (findNode->data < data) //不同在于这里指针递进的判断条件为,当前数据小于插入的数据则指针后移
//如果逆向排序的话,判断条件则会相反,以此类推
{
frontNode = findNode;
findNode = frontNode->next;
}
Node* newnode = (Node*)malloc(sizeof(Node));
if (newnode)
{
newnode->data = data; //关键点:当前获取的节点是大于输入的数据的节点
newnode->next = frontNode->next; //所以要将前一个指针的next指针赋给新插入的节点
frontNode->next = newnode; //再将前一个节点的next指针,指向插入的新节点
}
}
};
//删除指定节点
void deleteNode(Node* head, const int& data) {
//创建两个指针,一个用来查找数据节点,另外一个指针用来指向这个查找数据的指针
Node* findNode =head->next; //将第一个节点赋给查找数据指针
Node* frontNode = head; //将头节点指向查找数据的指针
//相当于Node* fineNode =frontNode->next;
if (findNode ==nullptr) //判断节点是否为空
{
cout << "节点为空,请插入节点" << endl;
return;
}
else
{
while (findNode->data!=data) //遍历查找数据
{
frontNode= findNode; //两个指针相互递进,头节点指针永远指向查找数据节点的指针
findNode = frontNode->next;
if (findNode == nullptr)
{
cout << "没有找到数据,请重试!"<<endl;
return;
}
}
frontNode->next = findNode->next; //找到要删除的数据之后,将查找数据节点的next指针,辅给头节点next指针
//完成链表的重连接,删除工作
cout << "数据已经删除!!" << endl;
free(findNode); //不要忘记释放这块内存
}
}
//遍历,查看链表数据
void traverse(Node* traverse) {
Node* p = traverse;
Node* movePoint = p->next;
while (movePoint)
{
cout<<movePoint->data<<endl;
movePoint = movePoint->next;
}
};
int main()
{
Node* list = creat_list();
int a = 10;
int b = 8;
pushBack(list,1);
pushBack(list,2);
pushBack(list,3);
pushBack(list,5);
pushBack(list,a);
cout << "顺序插入前排序" << endl;
traverse(list);
cout << endl;
cout << "准备插入数据" << b << endl;
cout << "顺序插入后排序" << endl;
rankNode(list,b);
traverse(list);
system("pause");
return 0;
}
有头单链表之完整操作(创建,头/尾/顺序插入,删除,遍历)
最新推荐文章于 2020-12-07 16:27:16 发布
本文详细介绍了有头单链表的各种操作,包括如何创建链表,如何在头部、尾部及任意位置插入节点,如何删除指定节点,以及如何进行链表的遍历。通过这些基本操作,读者可以深入理解单链表的数据结构和算法实现。
摘要由CSDN通过智能技术生成