C语言-实现对单循环链表中奇数和偶数结点的移动(前面奇数结点后面偶数结点)
单循环链表是C语言中比较常见的一种链式储存结构。
相较于普通的单链表,其特点就在于单循环链表的尾指针指向的是头结点。
即:
1.单链表
2.
单循环链表的有点就在于方便访问第一个结点,还方便访问最后一个结点。
那么,话不多说,先建立一个单循环链表:
(先给出相关的定义:PNode 、LinkList 分别表示结点和链表,DataType即int,结构体Node含有两个成员:data和next指针)
typedef int DataType;
typedef struct Node* PNode;
typedef struct Node* LinkList;
struct Node {DataType data;struct Node* next;
};
接下来就是建立单循环链表的函数:
ps:这样建立的单链表,会有一个空的头节点(head)。
LinkList CreateList_Tail_loop()
{LinkList head = (LinkList)malloc(sizeof(struct Node));PNode cur = NULL;PNode tail = head;DataType data;printf("please input some Numbers:\n");scanf_s("%d", &data);while (data != -1){cur = (struct Node*)malloc(sizeof(struct Node));cur->data = data;tail->next = cur;tail = cur;scanf_s("%d", &data);}tail->next = head;//尾指针指向头结点return tail;
}
链表建立好了之后,就可以开始进行移动了~
ps: tail为已经建立好的链表
temp用来记录头结点
pre为p的前驱结点,p为用于判断的结点。
PNode Move_Odd_Even(LinkList tail)
{PNode last = NULL, p = NULL, pre = NULL, temp = NULL;int flag = 1;last = tail;temp = tail->next;pre = tail->next;p = (tail->next)->next;tail->next = NULL;while (flag){if (p == tail){break;}if ((p->data) % 2 == 0){pre->next = p->next;p->next = NULL;last->next = p;last = p;p = pre->next;}else{pre = p; //记录p的前驱p = p->next;}}if (tail->data % 2 == 0){pre->next = p->next;p->next = NULL;last->next = p;last = p;}last->next = temp;tail = last;return tail;
}
来看全部代码与运行结果:
//实现对单循环链表中奇数和偶数结点的移动
#include<stdio.h>
#include<stdlib.h>
#include <cstddef>typedef int DataType;
typedef struct Node* PNode;
typedef struct Node* LinkList;
struct Node {DataType data;struct Node* next;
};
PNode Move_Odd_Even(LinkList tail);LinkList CreateList_Tail_loop()
{LinkList head = (LinkList)malloc(sizeof(struct Node));PNode cur = NULL;PNode tail = head;DataType data;printf("please input some nums:\n");scanf_s("%d", &data);while (data != -1){cur = (struct Node*)malloc(sizeof(struct Node));cur->data = data;tail->next = cur;tail = cur;scanf_s("%d", &data);}tail->next = head;return tail;
}void print(LinkList tail)
{PNode head = tail->next;PNode p = head->next;while (p != head){printf("%d ", p->data);p = p->next;}
}void DestoryList_Link(LinkList tail)
{PNode pre = tail->next;PNode p = pre->next;while (p != tail){free(pre);pre = p;p = pre->next;}free(pre);free(tail);
}int main()
{LinkList tail = NULL;LinkList p = NULL;tail = CreateList_Tail_loop();p = Move_Odd_Even(tail);print(p);DestoryList_Link(tail);return 0;
}PNode Move_Odd_Even(LinkList tail)
{PNode last = NULL, p = NULL, pre = NULL, temp = NULL;int flag = 1;last = tail;temp = tail->next;pre = tail->next;p = (tail->next)->next;tail->next = NULL;//第一个结点的data为奇数时while (flag){if (p == tail){break;}if ((p->data) % 2 == 0){pre->next = p->next;p->next = NULL;last->next = p;last = p;p = pre->next;}else{pre = p; //记录p的前驱p = p->next;}}if (tail->data % 2 == 0){pre->next = p->next;p->next = NULL;last->next = p;last = p;}last->next = temp;tail = last;return tail;
}
运行结果:
刚写的单循环链表时候还是遇到了蛮多的坑,吃了一些 有无空头节点 的苦。若是题目要求写一个函数实现链表操作的某一个功能时,一定要注意题中提供的链表有无头结点!
可以将tail以及其后面几个结点的值打印出来,这样就可以知道链表的模样了。
第一次写博客,若是有哪些写错的地方,欢迎大家在评论区留言指正~
C语言-实现对单循环链表中奇数和偶数结点的移动(前面奇数结点后面偶数结点)相关推荐
- (不带头结点的)单链表增删查改,逆置单链表(两种方法),求两个单链表的第一个公共结点,合并两个单链表,单循环链表中判断第一个入环点,约瑟夫环
补充了每个算法的基本思想,并且画了思路图,源代码都经过调试成功 1.SlistNode.c文件 (1) (不带头结点的)单链表增删查改 #include "SlistNode.h" ...
- C语言数据结构篇——单循环链表的创建,插入,节点删除,打印等操作
作者名:Demo不是emo 主页面链接:主页传送门 创作初心:对于计算机的学习者来说,初期的学习无疑是最迷茫和难以坚持的,中后期主要是经验和能力的提高,我也刚接触计算机1年,也在不断的探索,在CS ...
- 单循环链表中设置尾指针比设置头指针更好的原因
尾指针是指向终端结点的指针,用它来表示单循环链表可以使得查找链表的开始结点和终端结点都很方便. 设一带头结点的单循环链表,其尾指针为rear,则开始结点和终端结点的位置分别是rear->next ...
- C语言:删除线性链表中数据域为 item 的所有结点
算法思路 先从链表的第 2 个结点开始,从前往后依次判断链表中的所有结点是否满足条件,若某个结点的数据域为 item,则删除该结点.最后再回过头来判断链表中的第 1 个结点是否满足条件,若满足则将其删 ...
- 数据结构——单循环链表的
循环链表:循环链表是一个首尾相接的链表.将单链表最后一个结点的指针域由NULL改为指向表头结点,就得到了单链形式的循环链表,并称为循环单链表.同样还可以有多重链的循环链表. //定义结构体 typed ...
- c++语言偶数分离,在C++的链表中分离偶数和奇数节点
所以,我自学数据结构和算法.在解决一些问题时,我遇到了下面的问题,我必须分离链表的奇偶节点.在C++的链表中分离偶数和奇数节点 以下是问题陈述: 鉴于整数链表,编写一个函数来修改链表,使所有偶数在修改 ...
- 基于单循环链表实现俄罗斯轮盘赌游戏(C语言实现)
完成链表的学习后,作为一个小实践项目实现俄罗斯轮盘赌. 轮盘赌游戏基于单循环链表实现,使用C语言的rand函数生成随机数,注意要不断更新随机数种子. 俄罗斯轮盘赌,想必很多人都听说过,一种残忍的赌博游 ...
- 数据结构-单循环链表(C语言代码)
数据结构纯属新手,小白一枚,欢迎批评指正! 下面这个图是接下来要实现的单循环链表! 直接上代码OVO! 定义结构体 typedef struct Node {int data; //数据域struct ...
- C语言从已排序的链表中删除重复项(附完整源码)
C语言从已排序的链表中删除重复项 C语言从已排序的链表中删除重复项完整源码(定义,实现,main函数测试) C语言从已排序的链表中删除重复项完整源码(定义,实现,main函数测试) #include ...
最新文章
- DB-MySQL:MySQL 事务
- 文本每行都应该换行——vi文件末尾自动换行,不会导致php输出空行
- 【PC工具】震精!这个云办公云平台好强大,UZERME云端超级应用平台
- 小辣椒p60手机怎么样_小辣椒双机来临,搭载联发科 最低499元
- C++数据的一些注意事项
- 流程图 3条泳道 决策_制定透明决策的三步流程
- android studio 图表,Android Studio——记账本以及图表可视化实现
- 设计模式 - (3)抽象工厂模式(创建型)
- wpf 导航按钮去掉_高德地图推出个性导航,你的私人订制导航是什么样的?
- php php-fpm安装 nginx配置php
- JDK 1.8 官网下载地址(linux / windows)
- 队列的实现(C语言版)
- 百万富翁 混淆电路
- halcon 缺陷检测 药片检测(有无)
- Android自定义控件:NestedScrolling实现仿魅族flyme6应用市场应用详情弹出式layout
- 关于阿里云香港Region可用区C服务中断事件的说明
- h5 android 字体设置,解决因为手机设置字体大小导致h5页面在webview中变形的BUG
- sparksql java_JAVASparkSQL
- Linux上安装和使用git到gitoschina和github上_亲测
- 内行看门道:看似“佛系”的《QQ炫舞手游》,背后的音频技术一点都不简单...