有头单链表之完整操作(创建,头/尾/顺序插入,删除,遍历)

本文详细介绍了有头单链表的各种操作,包括如何创建链表,如何在头部、尾部及任意位置插入节点,如何删除指定节点,以及如何进行链表的遍历。通过这些基本操作,读者可以深入理解单链表的数据结构和算法实现。
摘要由CSDN通过智能技术生成
#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;
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值