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 单链表存储结构代码描述 若链表没有头结点,则头指针是指向第一个结点的指针. 若链表有头结点,则头指针是指向头结点的指针. 空链表的示意图: 带有头结点的单链表: 不带头结点的单链 ...
随机推荐
- 清除无用工具栏:CommandbarCleaner下载
下面演示的工具,适用于Office任一版本. 使用本工具之前,预先打开相应的Office软件. 下载: CommandbarCleaner.rar
- Java IO: 字符流的Piped和CharArray
作者: Jakob Jenkov 译者: 李璟(jlee381344197@gmail.com) 本章节将简要介绍管道与字符数组相关的reader和writer,主要涉及PipedReader.Pip ...
- maven 多bundle项目
1 环境 eclipse maven jdk1.8 多bundle项目需要一个父项目(聚合模块),起到聚合其他模块的作用,其他模块的管理工具,不包含实际的代码. 新建maven项目-->Crea ...
- 多版本firefox共存
https://blog.csdn.net/gavinxlf/article/details/53173034 https://blog.csdn.net/weixin_33979745/articl ...
- java枚举与常量类的区别
1)枚举型可以直接与数据库打交道,我通常使用varchar类型存储,对应的是枚举的常量名.(数据库中好像也有枚举类型,不过也没用过) 2) switch语句支持枚举型,当switch使用int.Str ...
- 对Design model的理解与Java design model的归纳
设计模式的起源是面向对象程序设计思想,是面向对象设计的精髓--抽象.面向对象通过类和对象来实现抽象,实现时产生了面向对象的三个重要机制:封装.继承.多态.正是这三个机制衍生出了各种各样的设计模式.在面 ...
- jQuery 源码学习 - 02 - jQuery.fn.extend 与 jQuery.extend
参考资料:[深入浅出jQuery]源码浅析--整体架构,备用地址:chokcoco/jQuery-. extend 方法在 jQuery 中是一个很重要的方法.jQuery 内部用它来拓展静态方法或者 ...
- log4j.properties和log4j.xml配置
>>>>1. 概述<<<< 1.1. 背景 在应用程序中添加日志记录总的来说基于三个目的:监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统 ...
- C#利用反射调用PB编译的COM组件
问题: 1.根据COM组件的ProgID,得到COM组件公开的类型 2.创建COM组件提供的类型的对象 3.调用执行方法 正确姿势 C#利用反射调用(后期绑定)PB编译的COM组件 C#调用COM组件 ...
- 斑马难题Step by Step
问题描述 分析 代码 在exercism.io被这个 Zebra Puzzle 难住了.这里一步一步的解决... 1.There are five houses. 2.The Englishman l ...