(一)单链表的动态创建

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;
}
}
总结:链表的学习主要是要懂明白栈、堆还有就是指针间的关系,以上为个人学习总结代码临时所写,可能存在不足。
11万+

被折叠的 条评论
为什么被折叠?



