链表很多人都会写,可以用很多不同的语言实现,但是我写这篇的真正目的是想理解在C++的内存中,链表的创建,删除是什么样的。目前虽然实现功能,但是还有一些地方不理解,希望有大佬指正或者提出建议。
链表的概念就不多说了,上一次用Java实现了链表这次用C++,来对比一下区别。链表介绍及JAVA实现
C++链表连接的理解
说一下对C++这个链表指针的理解:
p:移动的指针
curr:新创建的结点(将要加到链表中)
head:头结点(返回的结点)
- 先用p保留头结点的地址,next指向新结点,再把p指向新节点
- 最后让head指向自己的下一个结点,因为head当前是空的,尾结点p指向空
- 借图理解
新创建的链表在内存都是占有空间的,在程序结束时我们要释放内存。
ListNode* craet() {
ListNode *head =new ListNode(), *curr, *p ;
//初始化链表 LIST1
p = head;
for (int i = 0; i < 10; i++) {
curr = new ListNode(rand() % 100);
p->next = curr;
p = curr;
}
//head = head->next;
/*这里,可以直接返回一个head,但是返回的是空值,说明链表的头结点本身是空值,如果希望有数据,
可以给一个head->next,如果直接返回,那么遍历就要从head->next开始,删除的时候也是从next开始,
我这里先注释掉,下面的头结点都是空的*/
p->next = NULL;
return head;
}
下面写得比较简单粗略,主要是理解链表,Clear
函数还没来得及理解delete
的真实含义,下次补上
C++创建单链表
#include<iostream>
using namespace std;
/* 结点结构体,数据域和下一个地址 */
struct ListNode {
int val;
struct ListNode *next;
ListNode(){} //空构造
ListNode(int x) :
val(x), next(NULL) {
}
};
/* 实现链表的创建功能 其他跟java中实现的思想大致相同 */
ListNode* craet(){
ListNode *head =new ListNode(), *curr, *p ;
//初始化链表 LIST1
p = head;
for (int i = 0; i < 10; i++) {
curr = new ListNode(rand() % 100);
p->next = curr;
p = curr;
}
// head = head->next;
p->next = NULL;
return head;
}
/*从头到尾 打印整个链表*/
void ListDisplay(ListNode *myList) {
ListNode* p = myList->next;;
while (p != NULL) {
cout << p->val << " ";
p = p->next;
}
cout << endl;
}
/*新开辟的空间要释放内存*/
void ListClear(ListNode *head) {
while (head->next != NULL) {
ListNode *p = head->next;
delete head;
head = p;
}
}
int main(){
ListNode *myList=NULL;
myList = craet();
ListShow(myList);
ListClear(myList);
}
最后说一下自己对Java和C++的选择,JAVA很大众化,API可很好理解,对很多场景适用,而且因为有java虚拟机的存在不用考虑内存问题。但是个人会更喜欢C++,可能C++用的比较多,虽然用的时候会发现很多问题,但C++的兼容性真的太强大,在硬件编程中用到的C语法相似,第三方库都提供C++的接口,可以说学会了C++,其他语言都很好下手。而且C++的速度真的比其他语言快太多,还有其他的原因,So目前还是选择专注于C++。
待续。。。