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 单链表存储结构代码描述 若链表没有头结点,则头指针是指向第一个结点的指针. 若链表有头结点,则头指针是指向头结点的指针. 空链表的示意图: 带有头结点的单链表: 不带头结点的单链 ...
随机推荐
- Tarjan模板——求强连通分量
Tarjan求强连通分量的流程在这个博客讲的很清楚,再加上我也没理解透,这里就不写了. 缩点:将同一个连通块内的点视为同一个点. 扔一道模板题:codeVS2822爱在心中 第一问很显然就是求点数大于 ...
- 二、RabbitMQ简介及AMQP协议
RabbitMQ简介 RabbitMQ是开源的消息代理和队列服务器,是由Erlang语言开发的,基于AMQP协议(Advanced Message Queuing Protocol高级消息队列协议)的 ...
- python函数参数理解
1.位置参数 函数调用时,参数赋值按照位置顺序依次赋值. e.g. def function(x): 3 return x * x 5 print function(2) 输出结果: 4 def fu ...
- [LC] 359. Logger Rate Limiter
Design a logger system that receive stream of messages along with its timestamps, each message shoul ...
- SHELL用法八(Grep语句)
1.SHELL编程Grep语句案例实战 1)Find是Linux操作系统文件和目录的路径检索.查询工具,而Grep是Linux系统下文本文件内容检索或者匹配工具,Grep称为全局正则表达式检索工具,在 ...
- haproxy笔记之二:HAProxy简介
HAProxy提供高可用性.负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费.快速并且可靠的一种解决方案.HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持 ...
- Hibernate中的对象图关系转换:游离、持久、自由状态
- Luogu_2061_[USACO07OPEN]城市的地平线City Horizon
题目描述 Farmer John has taken his cows on a trip to the city! As the sun sets, the cows gaze at the cit ...
- 2016年3月13日 FXStreet首席分析师:欧元/美元下周走势展望
FX168讯 欧元/美元在经历周初沉闷的走势之后,最终在欧洲央行出台一系列措施促进通货膨胀和经济增长之后怒涨至近一个月最高位.欧洲央行决议公布之前,投资者预期存款利率将下调10至15个基点,并可能进一 ...
- 创业的游戏 明星APP上市前后的冰火两重天
明星APP上市前后的冰火两重天" title="创业的游戏 明星APP上市前后的冰火两重天"> 当下,似乎只有创业才是能够实现笑看风云变幻的那条"黄金通道 ...