网站首页 > 基础教程 正文
前篇给大家分享了单向链表的简单实现,本文就继续跟大家分享关于链表的增、删、改、查。可能有的朋友没有看过前一篇文章,为了确保大家都能看懂,我将之前的链表的实现的代码给大家贴一份:
#include "stdafx.h"
#include <stdio.h>
#include <iostream>
using namespace std ;
struct list
{
int num ;
list* next ;
};
list* creatList ()
{
//定義一個頭指針和一個臨時指針
list* head , *p;
//先需要開闢出來一個節點
head = new list ;
//让頭指針与中間變量指针指向同一个节点,让p去代替头去干累活
p = head ;
int num = 0;
while(true)
{
std::cout << "Please input the data for single linker : ";
std::cin >> num;
if(num != 0)
{
//开辟新的节点出来
list* temp = new list;
temp->num = num ;
//head 和 p在此時是指向同一個內存 同一個節點
p->next = temp ;
//此时p就指向了新增加的节点了
p = temp ;
}
else break;
}
//p 在此處成為尾節點
p->next = NULL ;
return head ;
}
int main()
{
list *test = creatList();
std::cout<<test->next->next->num<<std::endl;
list* node = test->next ;
while (node!=NULL)
{
list* p = node ;
node = node->next;
delete p ;
}
delete test ;
system("pause");
delete test
return 0 ;
}
这里,上一篇忘记封装一个释放链表的方法了,我写在main()方法中了,这里先把它封装了:
下面开始:实现节点的增加和删除。
增加节点
增加节点的方法分很多种,头插入法、尾插入法、中间插入法,头插和尾插都很简单,这里就将一下中间插入怎么实现:
因为头节点没有数据,所有头节点不算,思路是这样的:
1、先从头节点开始找到所需插入节点的序号对应的节点
2、新建立一个节点,给num赋值,再将新节点的next指向node next,然后将node的next指向新节点,这样就完成啦;
删除节点
默认不删头节点:
首先要判断要删的节点是否在链表中,然后大家要记得删除掉从链表中移除的节点,否则会造成内存泄露。
我们测试一下看下结果:
OK,结果没问题。至于查节点和改节点很简单,小编在这里就不多叙述了。
最后,附上源代码。注:小编只是为了给大家演示链表的原理并没有对代码做很好的封装,大家见谅,有兴趣的朋友可以用c++的类去封装一个。
#include "stdafx.h"
#include <stdio.h>
#include <iostream>
using namespace std ;
struct list
{
int num ;
list* next ;
};
list* creatList ()
{
//定義一個頭指針和一個臨時指針
list* head , *p;
//先需要開闢出來一個節點
head = new list ;
//让頭指針与中間變量指针指向同一个节点,让p去代替头去干累活
p = head ;
int num = 0;
while(true)
{
std::cout << "Please input the data for single linker : ";
std::cin >> num;
if(num != 0)
{
//开辟新的节点出来
list* temp = new list;
temp->num = num ;
//head 和 p在此時是指向同一個內存 同一個節點
p->next = temp ;
//此时p就指向了新增加的节点了
p = temp ;
}
else break;
}
//p 在此處成為尾節點
p->next = NULL ;
return head ;
}
void freeList(list* head)
{
list* node = head->next ;
while (node!=NULL)
{
list* p = node ;
node = node->next;
delete p ;
}
delete head ;
}
//中間插入
//head 需要插入的鏈錶 num 需要插入的數據 index为你要在哪个节点后面插入的序号
list* insert(list* head, int num, int index )
{
list* node, *insertNode,*node_next;
node = head->next ;
int i = 0 ;
while (node!=NULL)
{
if(i == index)
{
insertNode = new list;
insertNode->num = num ;
node_next = node->next ;
node->next = insertNode ;
insertNode->next = node_next ;
break;
}
node = node->next ;
i++ ;
}
if(i != index)cout<<"没有该节点"<<endl;
return head;
}
//head传入链表头节点 index为要删除的节点的序号,类似数组下标
list* deleteNode(list* head, int index )
{
list* node, *deleteNode;
node = head->next ;
int i = 0 ;
while (node!=NULL)
{
if(i == index -1)
{
if(node->next == NULL)cout<<"没有该节点"<<endl;
else
{
deleteNode = node->next ;
node->next = node->next->next;
delete deleteNode ;
}
break;
}
node = node->next ;
i++ ;
}
return head;
}
int main()
{
list *test = creatList();
std::cout<<test->next->next->num<<std::endl;
insert(test,124,2);
std::cout<<test->next->next->next->next->num<<std::endl;
deleteNode(test,2);
std::cout<<test->next->next->next->num<<std::endl;
freeList(test);
system("pause");
return 0 ;
}
- 上一篇: C++同步并发操作 c++ 多线程同步
- 下一篇: C++ split函数-C++字符串分割函数
猜你喜欢
- 2024-11-11 C++经典算法问题:背包问题(迭代+递归算法)!含源码示例
- 2024-11-11 C++进阶教程:C#嵌套循环 c++嵌套循环break
- 2024-11-11 C++经典算法 穷举法 穷举算法的优点
- 2024-11-11 C++数据结构-- 递归 排序 c++使用递归函数实现全排列
- 2024-11-11 如何使用c++发送window消息通知 c++怎么发给别人
- 2024-11-11 C++ replace函数-C++字符串替换函数
- 2024-11-11 C++学习:循环练习题(一) c++循环结构例题解析
- 2024-11-11 C/C++最细循环解析 c++循环结构23道题
- 2024-11-11 网络编程——C++实现socket通信(TCP)
- 2024-11-11 C++ GESP 2023年6月真题 c++历年真题解析
- 最近发表
- 标签列表
-
- jsp (69)
- pythonlist (60)
- gitpush (78)
- gitreset (66)
- python字典 (67)
- dockercp (63)
- gitclone命令 (63)
- dockersave (62)
- linux命令大全 (65)
- mysql教程 (60)
- pythonif (86)
- location.href (69)
- deletesql (62)
- c++模板 (62)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- console.table (62)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)