单向链表添加元素操作

创建单向链表

先创建链表并且初始化
单向链表添加元素操作_第1张图片

添加元素操作

Size一个都没有的时候

单向链表添加元素操作_第2张图片
证明是空链表

前插法

意思就是往前添加元素

第一步 : 创建结点

可以用C++ 的 new 创建结点 或者 用面向过程 的 function 来 创建

函数声明

//创建单向链表结点 
//创建链表头结点的函数
//参数:LinkNode* where = nullptr  
//LinkNode* where目的是给list->next赋值、不初始化数据域
LinkNode* creatorLinkNode(LinkNode* where = nullptr);

//创建单向链表结点 
//参数:const ElemType &elem  
//const ElemType &elem 目的是给 新结点的数据域初始化、不初始化指针域
LinkNode* creatorLinkNode(const ElemType &elem);

函数实现

LinkNode* creatorLinkNode(LinkNode* where){

	LinkNode* node = new LinkNode;
	node->next = where;
	return node;
		
}

LinkNode* creatorLinkNode(const ElemType& elem) {
	return new LinkNode{ elem ,nullptr};
}

创建结点
单向链表添加元素操作_第3张图片

第二步 : 链接结点

链接结点
参数 LinkNode& node, LinkNode& newnode**
链接思路:
如果(node->next)不是空指针
新结点的下一个结点指向传入结点的下一个结点
否则
结点的下一个结点指向新结点

相当于 3->5
4是新结点
4->5
4链接5
3的下一个结点指向4结点
3->4->5

伪代码::
如果(结点的next!=空指针){//为真
新结点的next指针指向 结点的next指针;;
}
结点的next指针指向 新结点;

函数声明

/*
链接结点
参数 LinkNode*& node, LinkNode*& newnode
链接思路:
如果(node->next)不是空指针
新结点的下一个结点指向传入结点的下一个结点
否则
结点的下一个结点指向新结点

相当于 3->5
	   4是新结点
	   4->5
	   4链接5
	   3的下一个结点指向4结点
	   3->4->5

	   if(node->next){
	     newnode->next = node->next;
	   } 
	   node->next = newnode;		
*/
void Link(LinkNode*& node, LinkNode*& newnode)

函数实现

void Link(LinkNode*& node, LinkNode*& newnode){

	if (node->next) {
		newnode->next = node->next;
	}
	node->next = newnode;
}
链接 第一步

单向链表添加元素操作_第4张图片

链接 第二步

单向链表添加元素操作_第5张图片

第三步 把链表的头结点传递到Link函数
Link(List.list, Newnode);
第四步 链表的个数+1
++List.size;

前插法 代码

//LinkNode* &Newnode  主调函数 分配内存
void LinkListInsert_froot(LinkList& List, LinkNode* &Newnode) {
	Link(List.list, Newnode);
	++List.size;
}

尾插法

意思就是靠后添加元素

第一步 : 创建结点

可以用C++ 的 new 创建结点 或者 用面向过程 的 function 来 创建

函数声明

//创建单向链表结点 
//创建链表头结点的函数
//参数:LinkNode* where = nullptr  
//LinkNode* where目的是给list->next赋值、不初始化数据域
LinkNode* creatorLinkNode(LinkNode* where = nullptr);

//创建单向链表结点 
//参数:const ElemType &elem  
//const ElemType &elem 目的是给 新结点的数据域初始化、不初始化指针域
LinkNode* creatorLinkNode(const ElemType &elem);

函数实现

LinkNode* creatorLinkNode(LinkNode* where){

	LinkNode* node = new LinkNode;
	node->next = where;
	return node;
		
}

LinkNode* creatorLinkNode(const ElemType& elem) {
	return new LinkNode{ elem ,nullptr};
}

创建结点
单向链表添加元素操作_第6张图片

循环找到末尾结点

单向链表添加元素操作_第7张图片

单向链表添加元素操作_第8张图片

	while (current->next){

		current = current->next;
	}
第二步 : 链接结点

链接结点
参数 LinkNode& node, LinkNode& newnode**
链接思路:
如果(node->next)不是空指针
新结点的下一个结点指向传入结点的下一个结点
否则
结点的下一个结点指向新结点

相当于 3->5
4是新结点
4->5
4链接5
3的下一个结点指向4结点
3->4->5

伪代码::
如果(结点的next!=空指针){//为真
新结点的next指针指向 结点的next指针;;
}
结点的next指针指向 新结点;

函数声明

/*
链接结点
参数 LinkNode*& node, LinkNode*& newnode
链接思路:
如果(node->next)不是空指针
新结点的下一个结点指向传入结点的下一个结点
否则
结点的下一个结点指向新结点

相当于 3->5
	   4是新结点
	   4->5
	   4链接5
	   3的下一个结点指向4结点
	   3->4->5

	   if(node->next){
	     newnode->next = node->next;
	   } 
	   node->next = newnode;		
*/
void Link(LinkNode*& node, LinkNode*& newnode)

函数实现

void Link(LinkNode*& node, LinkNode*& newnode){

	if (node->next) {
		newnode->next = node->next;
	}
	node->next = newnode;
}
把Current传递到Link函数
链接 第一步

单向链表添加元素操作_第9张图片

链接 第二步

单向链表添加元素操作_第10张图片

Link(Current, Newnode);

第四步 链表的个数+1
++List.size;

尾插法 代码

void LinkListInsert_back(LinkList& List, LinkNode*& Newnode) {

	LinkNode* current = List.list;
	while (current->next){

		current = current->next;
	}

	Link(current, Newnode);
	++List.size;
}
``

你可能感兴趣的:(小森数据结构算法技术总结,链表,数据结构,c++)