又见链表 --- 另一种Creat方式与反转
链表
作为一种数据结构,链表以其方便的增删查改功能,实现了无数经典有用的程序。
在之前的帖子里,我构建链表的方式是建立一个不储存数据的head节点,然后通过一边输入数据一边建立结点的方式构建整个链表。
与之前不同的是,这里建立的是包含数据的头结点head:
下面是代码,包含创建部分,输出部分,删除部分,和插入部分。
struct Node
{int data;Node *next;
};int n = 0; // 结点数 //=============Node_Creat==============//
Node *Node_Creat()
{Node *head = NULL; // 头指针置NULL Node *p1,*p2; // 开辟一个Node大小的空间 使p1和p2指向该空间 p1 = p2 = (Node *)malloc(sizeof(Node));if(p1 == NULL || p2 == NULL){printf("Overflow\n");exit(1);}scanf("%d",&p1 -> data); while(p1 -> data >= 0){n++;if(head == NULL){head = p1;} else{p2 -> next = p1;}p2 = p1;p1 = (Node *)malloc(sizeof(Node));if(p1 == NULL){printf("Overflow\n");exit(1);}scanf("%d",&p1 -> data);}p1 = NULL;p2 -> next = NULL;return head;
}//============Node_Print==============//
void Node_Print(Node *head)
{Node *p = head;if(head == NULL) // 链表为空 {printf("Empty!\n");return ;}else{printf("Total: %d Node\n",n);while(p != NULL){printf("%d ",p -> data);p = p -> next; }printf("\n");}
}//==============Node_Delete()===============//
void Node_Delete(Node *head,int num)
{Node *p1,*p2;p1 = head;if(p1 == NULL) // 链表为空{printf("Empty\n");return ;} if(num > n) // 结点不存在 {printf("Not Found!\n");return ;}n--; // 结点数-1 int i;for(i = 1; i < num; i++){if(p1 -> next == NULL)break;p2 = p1;p1 = p1 -> next;}if(p1 == head) // 头节点 即第一个{head = p1 -> next;}else{p2 -> next = p1 -> next;free(p1);}Node_Print(head);
}//============Node_Insert()============//
void Node_Insert(Node* head,int num,int i_data)
{Node * newNode;newNode = (Node *)malloc(sizeof(Node));if(newNode == NULL){printf("Overflow\n");exit(1);}newNode -> data = i_data;newNode -> next = NULL;Node *p1,*p2;p1 = head;for(int i = 1 ;i < num; i++){p2 = p1;p1 = p1 -> next;}p2 -> next = newNode;newNode -> next = p1;n++; // 结点数+1 Node_Print(head);
}
样例:
链表的反转
我这里采用的方法是 改变两个结点间next指针的指向,原结点next指针指向下一个结点,反转后指向前一个结点。
Node* Node_Reverse(Node* head)
{Node* pNow = head;//当前结点Node* pPrv = NULL;//当前结点的前一个结点Node* pReversedHead = NULL;//反转链表头结点Node* pNext = NULL;//当前结点的下一个结点while(pNow != NULL){pNext = pNow -> next;if(pNext == NULL)//如果当前结点的下一个结点为空,那么反转链表的头结点就是当前结点。pReversedHead = pNow;pNow -> next = pPrv;//当前结点指向前一个结点pPrv = pNow;//pPrv和pNow往前移动。pNow = pNext;//这里要使用前面保存下来的pNext,不能使用pNow->next}return pReversedHead;//返回反转链表头指针。
}
大概的一个流程图(反转第一个结点)
注:红色箭头代表pPrev,pNext和pNow的移动,蓝色代表next指针的指向。
转载于:https://www.cnblogs.com/qq952693358/p/5503244.html
又见链表 --- 另一种Creat方式与反转相关推荐
- 数据结构之头结点链表的三种插入方式(头插法,尾插法,在pos处插入)
创建头结点 流程:首先创建头结点表指针并为其分配空间--并将头结点指向空,防止出现段错误. 代码: //创建头结点 Node* Create_List () {//创建头结点Node* list = ...
- c语言单链表存储字符串,字符串的三种存储方式
@[TOC] 在数据结构中,字符串要单独用一种存储结构来存储,称为串存储结构.这里的串指的就是字符串.无论学习哪种编程语言,操作最多的总是字符串.我们平常使用最多的存储结构无疑是利用定长数组存储.但是 ...
- 带头节点反转链表的几种方式(附带gif流程图)
反转链表的几种方式 准备 Node类(节点): public class Node {public String data;public Node next;public Node(String da ...
- C语言之动态创建链表的两种方式
之前我们说的链表是基于静态创建的,但静态创建的链表很不灵活而且在工作中的项目中的很多场景都不适合,所以我们来记录一下链表的两种动态创建的方式. 1.方式一:链表动态创建之头插法 那么我们直接上代码讲: ...
- Java并发问题--乐观锁与悲观锁以及乐观锁的一种实现方式-CAS
Java并发问题–乐观锁与悲观锁以及乐观锁的一种实现方式-CAS </h1><div class="clear"></div><div c ...
- Linux下MySQL的几种安装方式
闲来有空,整理下Linux下Mysql的几种安装方式,分别使用yum/rpm.常规方式编译安装.cmake方式编译安装以及使用二进制方式免编译安装MySQL Linux系统环境: CentOS rel ...
- oracle Hash Join及三种连接方式
在Oracle中,确定连接操作类型是执行计划生成的重要方面.各种连接操作类型代表着不同的连接操作算法,不同的连接操作类型也适应于不同的数据量和数据分布情况. 无论是Nest Loop Join(嵌套循 ...
- 图的两种存储方式---邻接矩阵和邻接表
图:图是一种数据结构,由顶点的有穷非空集合和顶点之间边的集合组成,表示为G(V,E),V表示为顶点的集 合,E表示为边的集合. 首先肯定是要对图进行存储,然后进行一系列的操作,下面对图的两种存储方式邻 ...
- JavaScript中this的五种绑定方式详解
1 this的五种绑定方式 1.1 默认绑定 默认绑定是指当函数调用时,没有为其指定对象上下文,此时会将该函数的this绑定到全局对象(window对象).自ES5有了严格模式之后,默认绑定方式又分为 ...
最新文章
- 【最佳解法】剑指 Offer 32 - III. 从上到下打印二叉树 III
- 移动端去掉按钮点击热区
- GOOGLE的摄像头漏洞
- 疑似realme X9系列神秘新机曝光:搭载骁龙870处理器
- 程序员的黑科技_用代码回复博客
- gvim下用Vundle安装solarized主题的方法
- linux系统编程:自己动手写一个ls命令
- Android Studio 第五十三期 - 自定义EditText密码键盘
- 发现一个特给力的编写HTML/CSS的插件——Zen Coding
- CSS 字体 font-family属性
- 武汉大学计算机学院csc,2018年春武汉大学CSC公派出国留学录取名单
- P5960 【模板】差分约束算法
- BoBo买了一箱酸奶,里面有n盒未打开的酸奶,KiKi喜欢喝酸奶,第一时间发现了酸奶。KiKi每h分钟能喝光一盒酸奶,并且KiKi在喝光一盒酸奶之前不会喝另一个,那么经过m分钟后还有多少盒未打开的酸奶
- pythoncookie自动登录_Python使用cookie 免密登录了解一下
- MySQL单元选择题及答案(期末复习题)
- 【AHP层次分析法python部分实现】
- 发那科机器人GI分配_发那科机器人调试离线编程与应用 “I/O的分配”
- 在Windows上使用Google Chrome安装Helvetica Neue字体被认为是有害的
- c语言中的正切函数怎么用,C语言中正切的相关函数总结
- 同样是保存模型,model.save()和model. save_weights ()有何区别
热门文章
- (Tree)二叉树基本操作
- C/C 语言中extern的用法
- docx 图片预处理 Java_如何在java中将docx文件头图像复制到另一个docx文件中
- mysql 分词搜索_实战 | canal 实现Mysql到Elasticsearch实时增量同步
- php背景图片随页面大小改变,css背景图根据屏幕大小自动缩放
- 输入文字自动生成图片_批量生成变化的图片文字海报
- ambari mysql error code: 1665_ambari安装中常见的问题
- linux netty udp服务端,Netty实现UDP服务端
- swagger 动态设置版本号_如何快速玩转swagger
- OneNote使用说明