C++ 动态创建链表
#define _CRT_SECURE_NO_WARNINGS
#include <iostream> struct Node
{
int data;
Node* next;
}; Node* init_Node_m_head() //动态创建头节点
{
Node* temp = (Node*)malloc(sizeof(Node));
temp->data = ;
temp->next = NULL;
return temp; //返回头节点结构体指针 } void end_ADD(Node* Node_Data, Node* other) //传入头节点,和子节点,在尾部挂载节点
{
Node* now_m_head = Node_Data; //定义一个变量指向头节点的下一个节点
while (now_m_head->next!=NULL) //循环遍历该节点是否是最后一个节点
{
now_m_head = now_m_head->next; //如果该节点不是最后一个节点,则把当前指针指向下一个节点
}
other->next = now_m_head->next; //找到最后一个节点,把空地址赋值给子节点的next
now_m_head->next = other; //把最后一个节点赋值为子节点 } void printf_Node(Node* Node_Data) //打印链表
{
Node* temp = Node_Data->next; while (temp != NULL)
{
printf("%d->", temp->data);
temp = temp->next;
}
printf("NULL\n");
} Node* Node_init_zi(int n) //动态创建子节点
{
Node* temp = (Node*)malloc(sizeof(Node)); //动态申请Node类型的结构体
if (temp == NULL) //如果申请内存失败,则返回空
{
return NULL;
}
temp->data = n; //将n赋值给结构体变量,
return temp;
} void Add(Node* Node_m_head, Node* other) //在头节点后开始插入节点
{
other->next = Node_m_head->next; //将子节点的next赋值为头节点的next;
Node_m_head->next = other; //将头节点的next赋值为子节点 } Node* rand_add(Node* Node_m_head,int n,Node* other)//按指定位置插入数据
{
Node* temp = Node_m_head->next; //指向下一个节点
Node* last = Node_m_head; // 指向头节点
int i = ; //定义一个位置
do
{
++i;
if (i == n) //如果当前的位置和所要查找的位置一样,则把num存放到单链表上并挂在节点上 截断的节点挂在该新生成的节点尾部
{
Node* p=other; // 定义一个Node指针指向新节点
p->next = temp; //把截断的链表挂载在p的next上
last->next = p; //把新生成的节点,挂载temp的后面
return Node_m_head; //返回头节点数据
}
if (temp != NULL)
{
last = temp; //把上一个节点指向当前节点
temp = temp->next;//把当前节点指向下一个节点 } } while (temp != NULL); printf("您输入的位置有误,链表中未存储这么多的数据!\n");
printf("是否需要把数据插到最后面? 请输入1或者0, 1则插入到节点尾部,否则结束!\n");
int k;
scanf("%d",&k);
if (k == )
{
Node* p = other;
end_ADD(Node_m_head,p);
return Node_m_head;
}
else
return NULL; } Node* free_someone(Node* Node_m_head, int n) //指定删除某一个位置的节点
{
Node* temp = Node_m_head->next; //指向下一个节点
Node* last = Node_m_head; // 指向头节点
int i = ; //定义一个位置 do
{
++i;
if (i == n) //如果找到了该位置的节点 则把后面的节点的值挂到前面来
{
last->next = temp->next;
free(temp);
printf("第%d个节点已释放!\n", i);
return Node_m_head;
}
else
{
last = temp;
temp = temp->next;
} } while (temp!= NULL);
printf("大兄弟,链表中是空的,你想干啥??!\n");
return Node_m_head;
} void clear(Node* Data_m_head)
{
Node* temp = Data_m_head->next;
Node* now_jiedian;
while (temp != NULL)
{
now_jiedian = temp;
temp = temp->next;
free(now_jiedian); } printf("释放完成,链表已经清空\n");
printf("链表已更新,新的链表打印如下:\n");
printf_Node(Data_m_head);
} void play()
{
printf("--------------------------------------\n");
printf("1:链表初始化\n");
printf("2:创建单链表并在链表尾部插入\n");
printf("3:创建单链表并在头节点处插入\n");
printf("4:指定位置添加节点\n");
printf("5:指定删除某个位置的节点\n");
printf("6:打印当前链表\n");
printf("7:退出程序\n");
printf("--------------------------------------\n"); Node* Node_Data1 = init_Node_m_head(); //初始化头节点
while ()
{ printf("请输入选项\n"); int num;
scanf("%d", &num); switch (num)
{ case : //初始化链表,将链表的内容全部清空并重新动态创建一个节点
clear(Node_Data1);
break;
case : //动态创建一个节点,并从尾部插入
printf("即将在尾部插入节点\n");
int num1, num2; printf("请输入创建的单链表的个数(只能输入整数):");
scanf("%d", &num1); for (int i = ; i < num1; i++)
{
printf("请输入创建链表的值(只能输入整数):");
scanf("%d", &num2);
Node* temp = Node_init_zi(num2);
end_ADD(Node_Data1, temp);
}
printf("链表已更新,新的链表打印如下:\n");
printf_Node(Node_Data1); break;
case : //动态创建一个节点,并从头部插入
printf("即将在头节点处插入一个节点\n"); int num3, num4;
printf("请输入创建的单链表的个数(只能输入整数):");
scanf("%d", &num3); for (int i = ; i < num3; i++)
{
printf("请输入创建链表的值(只能输入整数):");
scanf("%d", &num4);
Node* temp = Node_init_zi(num4);
Add(Node_Data1, temp);
}
printf("链表已更新,新的链表打印如下:\n");
printf_Node(Node_Data1);
break;
case : //指定位置进行插入
printf("即将在指定位置添加节点\n");
int num5, num6, num7; printf("请输入创建的单链表的个数(只能输入整数):");
scanf("%d", &num5); for (int i = ; i < num5; i++)
{
printf("请输入创建的链表的位置(只能输入整数):");
scanf("%d", &num6);
printf("请输入创建链表的值(只能输入整数):");
scanf("%d", &num7);
Node* temp = Node_init_zi(num7);
rand_add(Node_Data1, i+num6,temp);
}
printf("链表已更新,新的链表打印如下:\n");
printf_Node(Node_Data1); break;
case : //指定位置删除
int num8, num9;
printf("即将要删除一个节点\n");
printf("请输入要删除的单链表的个数(只能输入整数):");
scanf("%d", &num8); for (int i = ; i < num8; i++)
{
printf("请输入要删除的链表的位置(只能输入整数):");
scanf("%d", &num9); free_someone(Node_Data1,i+num9);
printf("链表已更新,新的链表打印如下:\n");
printf_Node(Node_Data1);
} break;
case : printf_Node(Node_Data1);
break; case :
printf("----------程序即将退出----------");
exit(); default:
break;
}
} } int main()
{ play(); system("pause");
return ;
}

C++ 动态创建链表的更多相关文章
- C语言:创建动态单向链表,创建完成后,输出每一个节点的数据信息。
// // main.c // dynamic_link_list // // Created by ma c on 15/8/5. // Copyright (c) 2015. All ri ...
- 动态单链表的传统存储方式和10种常见操作-C语言实现
顺序线性表的优点:方便存取(随机的),特点是物理位置和逻辑为主都是连续的(相邻).但是也有不足,比如:前面的插入和删除算法,需要移动大量元素,浪费时间,那么链式线性表 (简称链表) 就能解决这个问题. ...
- MFC之RTTI与动态创建
本人能力.精力有限,所言所感都基于自身的实践和有限的阅读.查阅,如有错误,欢迎拍砖,敬请赐教——博客园:钱智慧. 在说RTTI之前需要明白c++中类静态成员的初始化特点:类的静态数据成员需要在类体外显 ...
- MFC原理第四讲.动态创建机制
MFC原理第四讲.动态创建机制 一丶要学习的知识点以及简介 动态创建是什么意思? 动态创建其实就是跟C++的new一样.都是创建对象.但是规避了C++语法的缺陷. 例如: char * ClassNa ...
- 《深入浅出MFC》系列之动态创建
/*************************************************************************************************** ...
- MFC六大核心机制之三:动态创建
MFC中很多地方都使用了动态创建技术.动态创建就是在程序运行时创建指定类的对象.例如MFC的单文档程序中,文档模板类的对象就动态创建了框架窗口对象.文档对象和视图对象.动态创建技术对于希望了解MFC底 ...
- 算法之python创建链表实现cache
算法之python创建链表实现cache 本节内容 问题由来 解决思路 实现代码 总结 1. 问题由来 问题起因于朋友的一次面试题,面试公司直接给出两道题,要求四十八小时之内做出来,语言不限,做出来之 ...
- 利用MAP动态创建C++类对象
MFC的CRuntimeClass利用链表实现了C++类的动态创建.但是如果项目中对动态创建的要求比较低,我们完全可以利用map实现简单的动态创建. http://blog.csdn.net/yeji ...
- 数据结构 - 动态单链表的实行(C语言)
动态单链表的实现 1 单链表存储结构代码描述 若链表没有头结点,则头指针是指向第一个结点的指针. 若链表有头结点,则头指针是指向头结点的指针. 空链表的示意图: 带有头结点的单链表: 不带头结点的单链 ...
随机推荐
- python掉包侠与深浅拷贝
今日所得 包 logging模块 hashlib模块 openpyxl模块 深浅拷贝 包 在学习模块的时候我们了解过模块的四种表现形式,其中的一种就是包. 什么是包? 它是一系列模块文件的结合体,表示 ...
- mysql 优化配置和方面
MySQL性能优化的参数简介 公司网站访问量越来越大,MySQL自然成为瓶颈,因此最近我一直在研究 MySQL 的优化,第一步自然想到的是 MySQL 系统参数的优化,作为一个访问量很大的网站(日20 ...
- ReentrantLock(重入锁)的源码解析
转自:从源码角度彻底理解ReentrantLock(重入锁)](https://www.cnblogs.com/takumicx/p/9402021.html)) 公平锁内部是FairSync,非公平 ...
- Skipping MapperFactoryBean with name 'sysUserMapper' and 'com.buding.system.mapper.SysUserMapper' mapperInterface. Bean already defined with the same name!
前几天整体看了一下SpringBoot的简介,觉得看不如自己动手做,于是动手做一个简单的用户管理.启动的时候遇到了Skipping MapperFactoryBean with name 'sysUs ...
- python3下应用pymysql(第三卷)(数据自增-用于爬虫)
在上卷中我说出两种方法进行数据去重自增,第一种就是在数据库的字段中设置唯一字段,二是在脚本语言中设置重复判断再添加(建议,二者同时使用,真正开发中就会用到) 话不多说先上代码 第一步: 确定那一字段的 ...
- SpringSecurity 如何提示错误
1.可以通过authentication-failure-url="/login.html?error=1" 前端接收参数,根据参数提示 错误 2.前端vue this.myNam ...
- onbeforeunload事件兼容性操作
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- List.remove()的使用注意
不使用forEach的循环 使用forEach循环 参考 今天修改一个bug,需要取一个List和一个Set的交集,使用了双重循环.想着提高循环效率,每加入一个交集中的元素,就将List中的元素删除, ...
- rsync auth failed on module xxx
rsync 报错 "auth failed on module xxx", 一般有三种情况造成: 密码文件格式错误: 服务端密码文件的格式是: user:password 每个一行 ...
- 操作系统-IO管理和磁盘调度
I/O设备 IO设备的类型 分为三类:人机交互类外部设备:打印机.显示器.鼠标.键盘等等.这类设备数据交换速度相对较慢,通常是以字节为单位进行数据交换的 存储设备:用于存储程序和数据的设备,如磁盘.磁 ...