C++:数据结构-链表创建

链表很多人都会写,可以用很多不同的语言实现,但是我写这篇的真正目的是想理解在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++。

待续。。。

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值