#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. [洛谷P3806] [模板] 点分治1

    洛谷 P3806 传送门 这个点分治都不用减掉子树里的了,直接搞就行了. 注意第63行 if(qu[k]>=buf[j]) 不能不写,也不能写成>. 因为这个WA了半天...... 如果m ...

  2. OpenCV 改变图像的对比度和亮度

    #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <ios ...

  3. miRNA|housekeeping|RNAi|siRNA|Oncomirs|miRBase|PMRD|TargetScan|miRDeep|miRNA target|seed regions|

    生物信息学-miRNA 转录组的分类: Noncoding RNA可分为负责Regulatory和housekeeping,housekeeping就是组织日常功能miRNA便是Regulatory ...

  4. whatsoever|

    ADV (用于名词词组后,强调否定陈述)丝毫,任何,无论什么You use whatsoever after a noun group in order to emphasize a negative ...

  5. caffe之那些依赖的库

    1. Boost库 Boost是一个可移植的,提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一.Boost强调对跨平台的支持,编译与平台无关.Caffe采用C++为主要开发语言 ...

  6. 配置gitlab(备忘)

    已经配置好github的基础上,clone gitlab 地址git status 显示改变了的文件但是webstorm文件颜色不改变问题的解决:VCS->git-->remotes--& ...

  7. PHP 错误与异常的日志记录

    提到 Nginx + PHP 服务的错误日志,我们通常能想到的有 Nginx 的 access 日志.error 日志以及 PHP 的 error 日志.虽然看起来是个很简单的问题,但里面其实又牵扯到 ...

  8. 二、Android XML数据解析

    XML,可扩展标记语言.可以用来存储数据,可以看做是一个小型的数据库,SharedPreference就是使用XML文件存储数据的,SQLite底层也是一个XML文件,而在网络应用方面,通常作为信息的 ...

  9. google搜索运算符+101个Google技巧 - Google技巧的终极收集

    下面内容整理自网络 搜索运算符 如果您使用我们的基本搜索技巧后,并未找到想要搜索的内容,可以尝试使用搜索运算符.您只需在 Google 搜索框中将这些符号或字词添加到搜索字词中,即可更好地掌控要显示的 ...

  10. SpringMVC之添加照片并修改照片名字

    @RequestMapping(value="/addIdcardsSubmit",method={RequestMethod.POST,RequestMethod.GET}) p ...