C++单链表学习笔记

(一)单链表的动态创建

1.先创建出一第一个节点,p1指向该点内存。因为是第一个节点所以头指针也指向该点,

2.使刚创建的点变为上个节点,再创建一个节点变为下个节点,用next指针连接。即

3.依次循环创建下一个节点,最后一个节点的next指向空。

// 链表的节点
class book2
{
public:
	int num;
	float price;
	book2 *next;
};
// 链表的动态创建(返回头指针)
book2 *creat_()
{
	book2 *head = NULL, *p1 = NULL, *p2 = NULL;
	int num_temp;
	float price_temp;
	cout << "请输入书的编号,-1为结束" << endl;
	cin >> num_temp;
	if (num_temp == -1)
		return head;
	cout << "请输入书的价格" << endl;
	cin >> price_temp;
	p1 = new book2;
	p1->num = num_temp;
	p1->price = price_temp;
	head = p1;// 让头指针指向第一个节点地址
	while (1)
	{
		cout << "请输入书的编号,-1为结束" << endl;
		cin >> num_temp;
		if (num_temp == -1)
		{
			p1->next = NULL;
			break;
		}
			
		cout << "请输入书的价格" << endl;
		cin >> price_temp;
		p2 = p1;
		p1 = new book2;
		p1->num = num_temp;
		p1->price = price_temp;
		p2->next = p1;
	}

	return head;
}

(二)单链表节点的删除

        链表是由节点与指针组成,每个节点的形都是由 new 创建出来的存放在堆中,比如:,必须要明白 new book2是创建出来了一个对象,而这个对象是放入堆中然后是由一个p1指针指向这一个地址,在链表中会有上个节点的next指针也指向这个地址,要记住p1与上一个节点的next指针之间是没有联系的,只是都指向同一个地方而已,如果一个改变是不会对另一个指针产生影响的,如下图的关系。

用以下节点删除代码进行解释

book2 *delete_(book2 *phead, int i)
{
	book2 *head = phead;//将头指针保存下来
	while (phead != NULL)//进行链表遍历
	{
		if (phead->num == i)//判断是否删除该节点
		{
			book2 *l = phead;//保存将要删除节点的指针,为后面释放该节点内存
			phead = phead->next;//上个节点->next = phead,所以这句为上个节点->next = phead->next
			delete l;//释放要删除节点的内存
			break;
		}
		phead = phead->next;//跳到下一个节点
	}
	return head;
}

 上面的代码错误是因为下面这句话,

phead = phead->next;//上个节点->next = phead,所以这句为上个节点->next = phead->next

这句话看似是该节点的上个节点的next指向该节点的下个节点,去掉了该节点重新组成了链表,但是因为 ,上个节点->next 与phead只是指向同一个地方,它俩并不是同一个指针,所以 phead = phead->next 不等于 上个节点->next = phead->next。由此可看出要想删除某一个节点,就得有上个节点->next ,所以从上个节点就开始进行操作删除节点,而不是在将要删除的节点上进行操作,如下图在p节点上进行操作。

                                              

正确删除节点代码如下:

book2 *delete_(book2 *phead, int i)
{
	if (phead == NULL)
		return NULL;
	book2 *head = phead; //将头指针保存下来
	if (phead->num == i) // 判断是否删除第一个节点
	{
		book2 *l = phead;
		head = phead->next;
		delete l;
		return head;
	}
	while (phead->next != NULL)// 遍历并判断下个节点是否是要被删除的节点
	{
		if (phead->next->num == i)
		{
			book2 *l = phead->next;
			phead->next = phead->next->next;//next指针指向下下个节点
			delete l;//将下个节点内存释放
			break;
		}
		phead = phead->next;
	}
	return head;
}

(三)单链表节点的插入

单链表节点的插入与删除相似,思想是一样的。都是打断后的重新组成。以下为代码

book2 *insert_(book2 *phead, book2 *node,int i)
{
	book2 *head = phead; //保存头指针
	if (phead == NULL) //为空链表插入第一个节点
	{
		head = node;
		node->next = NULL;
		return head;
	}
	if(phead->num == i)//插入第一个节点时
	{
		head = node;
		node->next = phead;
		return head;
	}
	while (phead->next != NULL)//遍历并判断是否为插入点
	{
		if (phead->next->num = i)
			{
				node->next = phead->next;
				phead->next = node;
				break;
			}
		phead = phead->next;
	}
	
}

总结:链表的学习主要是要懂明白栈、堆还有就是指针间的关系,以上为个人学习总结代码临时所写,可能存在不足。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值