#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++ 动态创建链表的更多相关文章

  1. C语言:创建动态单向链表,创建完成后,输出每一个节点的数据信息。

    // //  main.c //  dynamic_link_list // //  Created by ma c on 15/8/5. //  Copyright (c) 2015. All ri ...

  2. 动态单链表的传统存储方式和10种常见操作-C语言实现

    顺序线性表的优点:方便存取(随机的),特点是物理位置和逻辑为主都是连续的(相邻).但是也有不足,比如:前面的插入和删除算法,需要移动大量元素,浪费时间,那么链式线性表 (简称链表) 就能解决这个问题. ...

  3. MFC之RTTI与动态创建

    本人能力.精力有限,所言所感都基于自身的实践和有限的阅读.查阅,如有错误,欢迎拍砖,敬请赐教——博客园:钱智慧. 在说RTTI之前需要明白c++中类静态成员的初始化特点:类的静态数据成员需要在类体外显 ...

  4. MFC原理第四讲.动态创建机制

    MFC原理第四讲.动态创建机制 一丶要学习的知识点以及简介 动态创建是什么意思? 动态创建其实就是跟C++的new一样.都是创建对象.但是规避了C++语法的缺陷. 例如: char * ClassNa ...

  5. 《深入浅出MFC》系列之动态创建

    /*************************************************************************************************** ...

  6. MFC六大核心机制之三:动态创建

    MFC中很多地方都使用了动态创建技术.动态创建就是在程序运行时创建指定类的对象.例如MFC的单文档程序中,文档模板类的对象就动态创建了框架窗口对象.文档对象和视图对象.动态创建技术对于希望了解MFC底 ...

  7. 算法之python创建链表实现cache

    算法之python创建链表实现cache 本节内容 问题由来 解决思路 实现代码 总结 1. 问题由来 问题起因于朋友的一次面试题,面试公司直接给出两道题,要求四十八小时之内做出来,语言不限,做出来之 ...

  8. 利用MAP动态创建C++类对象

    MFC的CRuntimeClass利用链表实现了C++类的动态创建.但是如果项目中对动态创建的要求比较低,我们完全可以利用map实现简单的动态创建. http://blog.csdn.net/yeji ...

  9. 数据结构 - 动态单链表的实行(C语言)

    动态单链表的实现 1 单链表存储结构代码描述 若链表没有头结点,则头指针是指向第一个结点的指针. 若链表有头结点,则头指针是指向头结点的指针. 空链表的示意图: 带有头结点的单链表: 不带头结点的单链 ...

随机推荐

  1. highcharts series几种写法

    一.数据列 数据列是一组数据集合,例如一条线,一组柱形等.图表中所有点的数据都来自数据列对象,数据列的基本构造是: series : [{ name : '', data : [] }] 提示:数据列 ...

  2. SHELL用法三(变量及参数设置)

    京峰JF2115-Day45上课笔记 1.SHELL编程变量命名规范: 变量分为:系统变量.环境变量.用户变量: 定义变量时使用=赋值,无需通过declare定义变量的类型: 变量赋值时,=前后是不能 ...

  3. c/c++ main 函数命令行参数的使用

    C程序最大的特点就是所有的程序都是用函数来装配的.main()称之为主函数,是所有程 序运行的入口.其余函数分为有参或无参两种,均由main()函数或其它一般函数调用,若调用的是有参函数,则参数在调用 ...

  4. 关于Synchornized,Lock,AtomicBoolean和volatile的区别介绍

    1.  volatile 变量可以被看作是一种 "程度较轻的 synchronized". 2.  Lock 实现提供了比使用 synchronized 方法和语句可获得的更广泛的 ...

  5. Tuning xgboost in R:Part 1

    第一次调整Boosting算法的参数可能是一个非常艰难的任务.有很多参数可供选择,调整不同的参数会有不同的结果产生.最好的调参可能是取决于数据.每当我得到一个新的数据集,我都会学到一些新的东西.对分类 ...

  6. 如何快速找出Linux中的重复文件

    md5sum | sort | uniq -w32 --all-repeated=separate [1]find -not -empty -type f -printf “%s\n” :find是查 ...

  7. Docker学习笔记_04 Rancher的部署安装(编排选用K8S)

    原文地址:http://dbase.cc/2018/01/12/docker/04_rancher的部署安装/ 为什么要使用Rancher Rancher是一个开源的企业级容器管理平台.通过Ranch ...

  8. golang实现chunk方式的查询

    有一个需求,是把表里面所有的数据都查询出来,并且生成json文件.因为一张表里面的数据很多,所以不可能一次性全部查询出来,所以需要用到chunk.之前用的gorm,但是发现gorm没有chunk方式的 ...

  9. 安卓权威编程指南-笔记(第23章 HTTP与后台任务)

    1. 网络连接基本 //通过指定URL获取原始数据,并返回一个字节流数组. public byte[] getUrlBytes(String urlSpec)throws IOException{ / ...

  10. 探究 Go 语言 defer 语句的三种机制

    Golang 的 1.13 版本 与 1.14 版本对 defer 进行了两次优化,使得 defer 的性能开销在大部分场景下都得到大幅降低,其中到底经历了什么原理? 这是因为这两个版本对 defer ...