题目

设计一个算法,将一个头结点为A的单链表(其数据域为整数)分解成两个单链表A和B.使得A链表只含有原来链表中data 域为奇数的结点,而B链表只含有原链表中data城为偶数的结点,且保持原来的相对顺序。

分析

解决思路为:用指针p从头至尾扫描A链表,当发现结点data域为偶数的结点则取下,插入链表B中。因为题目要求保持原来数据元素的相对顺序,所以要用尾插法来建立B链表。

核心代码如下:

/* 将A链表中的奇数和偶数分离出来,奇数继续保留在A链表中,偶数保留在B链表中 */
/* *A指的是要处理的单链表;*&B指的是要保存偶数的新链表 */
void sepEvenAndOdd(LNode *A,LNode *&B) {LNode *tempA=A->next;// 开始结点LNode *pre=A;// 保存A链表的头结点(其实是保存的是前驱结点)B=(LNode *)malloc(sizeof(LNode)); // 创建B链表B->next=NULL;LNode *tempB=B; // 保存B链表的头结点(其实是尾指针结点)LNode *tempDelNode; // 临时保存删除结点while(tempA!=NULL) { // 循环A链表if(tempA->data%2!=0) { // 判断A链表中的结点的data值是奇数还是偶数pre=tempA;// 如果是奇数,将前驱结点置为当前结点tempA=tempA->next; // 并且到下一个结点去} else { // 如果是偶数tempDelNode=tempA;// 临时保存要删除的结点,即偶数结点pre->next=tempDelNode->next;// 连接A链表,删除偶数结点tempA=tempA->next; // A链表继续遍历到下一个结点tempB->next=tempDelNode; // 将偶数结点链接到B链表上tempB=tempDelNode;// 将B链表的尾结点置为当前新添加的结点}}tempB->next=NULL;// 注意:需将添加结点成功的B链表终端节点的next置为NULL
}

完整代码如下:

#include <stdio.h>
#include <stdlib.h>
// 声明单链表结构体
struct LNode {int data;struct LNode *next;
};/* 通过用户输入数据创建一个单链表,由用户输入整型测试数据 */
/* 返回一个单链表 */
LNode * createList() {LNode *head;LNode *p1,*p2;p1=p2=(LNode *)malloc(sizeof(LNode));head=(LNode *)malloc(sizeof(LNode));scanf("%ld",&p1->data);int i=0;while(p1->data!=0) { // 当用户在控制台输入0时结束循环i+=1;if(i==1) {head->next=p1;} else {p2->next=p1;}p2=p1;p1=(LNode *)malloc(sizeof(LNode));scanf("%ld",&p1->data);}p2->next=NULL;return head;
}/* 打印单链表 */
/* *list指的是要被打印输出的单链表 */
void printList(LNode *list) {LNode *temp=list->next;// 单链表的开始结点printf("\n");while(temp!=NULL) { // 循环单链表printf("%ld\t",temp->data); // 打印单链表中的data数据temp=temp->next; // 遍历至下一个结点}printf("\n"); // 换行
}/* 将A链表中的奇数和偶数分离出来,奇数继续保留在A链表中,偶数保留在B链表中 */
/* *A指的是要处理的单链表;*&B指的是要保存偶数的新链表 */
void sepEvenAndOdd(LNode *A,LNode *&B) {LNode *tempA=A->next;// 开始结点LNode *pre=A;// 保存A链表的头结点(其实是保存的是前驱结点)B=(LNode *)malloc(sizeof(LNode)); // 创建B链表B->next=NULL;LNode *tempB=B; // 保存B链表的头结点(其实是尾指针结点)LNode *tempDelNode; // 临时保存删除结点while(tempA!=NULL) { // 循环A链表if(tempA->data%2!=0) { // 判断A链表中的结点的data值是奇数还是偶数pre=tempA;// 如果是奇数,将前驱结点置为当前结点tempA=tempA->next; // 并且到下一个结点去} else { // 如果是偶数tempDelNode=tempA;// 临时保存要删除的结点,即偶数结点pre->next=tempDelNode->next;// 连接A链表,删除偶数结点tempA=tempA->next; // A链表继续遍历到下一个结点tempB->next=tempDelNode; // 将偶数结点链接到B链表上tempB=tempDelNode;// 将B链表的尾结点置为当前新添加的结点}}tempB->next=NULL;// 注意:需将添加结点成功的B链表终端节点的next置为NULL
}int main() {/* [0.]创建初始测试单链表 */LNode *list,*list2;list=createList();// 创建测试链表list2=list;printList(list);// 打印单链表sepEvenAndOdd(list,list2);// 分离奇数偶数链表printList(list); // 打印奇数链表printList(list2);// 打印偶数链表return 0;
}

运行结果如下:

扩展

下面是关于求一个链表中奇数和偶数的。

分离链表中的奇数留下偶数:

/* 分离奇数结点,得到全是偶数结点的链表 */
void sepOdd(LNode *A){LNode *temp=A->next;// 开始结点LNode *pre=A;// 头结点(直接前驱)LNode *tempDelNode;// 临时保存被删除结点while(temp!=NULL){if(temp->data%2==0){pre=temp;temp=temp->next;}else{tempDelNode=temp;pre->next=tempDelNode->next;temp=temp->next;free(tempDelNode);}} }

分离链表中的偶数留下奇数:

/* 分离偶数结点,得到全是奇数结点的链表 */
void sepEven(LNode *A){LNode *temp=A->next;// 开始结点LNode *pre=A;// 直接前驱 LNode *tempDelNode;while(temp!=NULL){if(temp->data%2!=0){pre=temp;temp=temp->next;}else{tempDelNode=temp;pre->next=tempDelNode->next;temp=temp->next;free(tempDelNode);}}
}

测试代码如下:

#include <stdio.h>
#include <stdlib.h>
// 声明单链表结构体
struct LNode {int data;struct LNode *next;
};/* 通过用户输入数据创建一个单链表,由用户输入整型测试数据 */
/* 返回一个单链表 */
LNode * createList() {LNode *head;LNode *p1,*p2;p1=p2=(LNode *)malloc(sizeof(LNode));head=(LNode *)malloc(sizeof(LNode));scanf("%ld",&p1->data);int i=0;while(p1->data!=0) { // 当用户在控制台输入0时结束循环i+=1;if(i==1) {head->next=p1;} else {p2->next=p1;}p2=p1;p1=(LNode *)malloc(sizeof(LNode));scanf("%ld",&p1->data);}p2->next=NULL;return head;
}/* 打印单链表 */
/* *list指的是要被打印输出的单链表 */
void printList(LNode *list) {LNode *temp=list->next;// 单链表的开始结点printf("\n");while(temp!=NULL) { // 循环单链表printf("%ld\t",temp->data); // 打印单链表中的data数据temp=temp->next; // 遍历至下一个结点}printf("\n"); // 换行
}/* 分离偶数结点,得到全是奇数结点的链表 */
void sepEven(LNode *A){LNode *temp=A->next;// 开始结点LNode *pre=A;// 直接前驱 LNode *tempDelNode;while(temp!=NULL){if(temp->data%2!=0){pre=temp;temp=temp->next;}else{tempDelNode=temp;pre->next=tempDelNode->next;temp=temp->next;free(tempDelNode);}}
}/* 分离奇数结点,得到全是偶数结点的链表 */
void sepOdd(LNode *A){LNode *temp=A->next;// 开始结点LNode *pre=A;// 头结点(直接前驱)LNode *tempDelNode;// 临时保存被删除结点while(temp!=NULL){if(temp->data%2==0){pre=temp;temp=temp->next;}else{tempDelNode=temp;pre->next=tempDelNode->next;temp=temp->next;free(tempDelNode);}} }int main() {/* [0.]创建初始测试单链表 */LNode *list,*list2;list=createList();// 创建测试链表printList(list);// 打印单链表sepEven(list);// 分离偶数 printList(list);// 打印全是奇数的链表  list2=createList();printList(list2);sepOdd(list2);// 分离奇数 printList(list2);// 打印全是偶数的链表 return 0;
}

结果如下:

分离顺序表的奇数和偶数

分离的核心代码如下:

/* 分离奇数,留下全是偶数的顺序表 */
/* &list指的是要被分离的顺序表 */
void sepOdd(SqlList &list){int i=0;// 计数器,记录当前是第几个数 while(i<list.length){if(list.a[i]%2!=0){ // 判断是否是偶数// 如果不是偶数则删除顺序表中的奇数 for(int m=i;m<list.length-1;m++){ // 将奇数后的所有数向前移动一个位置 list.a[m]=list.a[m+1];}list.length--;// 顺序表长度减1 }else{// 如果是奇数的话,则保留在顺序表中,继续判断下一个数 i++;// 计数器+1 }}
}/* 分离偶数,留下全是奇数的顺序表 */
/* &list指的是要被分离的顺序表 */
void sepEven(SqlList &list){int i=0;// 计数器while(i<list.length){if(list.a[i]%2==0){for(int m=i;m<list.length-1;m++){list.a[m]=list.a[m+1];}list.length--;}else{i++;}}
} 

完整代码如下:

#include <stdio.h>
#include <stdlib.h>#define maxSize 20typedef struct SqlList {int a[maxSize];int length;
} SqlList;/* 创建顺序表 */
void createList(SqlList &L) {int tempNo = 1;int tempData = 0;do {printf("请输入顺序表第%d个元素:",tempNo);scanf("%d",&tempData);if(tempData!=-1) {L.a[tempNo-1] = tempData;L.length = tempNo;tempNo++;}} while(tempNo<=maxSize&&tempData!=-1);
}/* 打印顺序表 */
void printSqlList(SqlList list) {printf("\n");for(int i=0; i<list.length; i++) {printf("%d\t",list.a[i]);}printf("\n");
}/* 分离奇数,留下全是偶数的顺序表 */
/* &list指的是要被分离的顺序表 */
void sepOdd(SqlList &list){int i=0;// 计数器,记录当前是第几个数 while(i<list.length){if(list.a[i]%2!=0){ // 判断是否是偶数// 如果不是偶数则删除顺序表中的奇数 for(int m=i;m<list.length-1;m++){ // 将奇数后的所有数向前移动一个位置 list.a[m]=list.a[m+1];}list.length--;// 顺序表长度减1 }else{// 如果是奇数的话,则保留在顺序表中,继续判断下一个数 i++;// 计数器+1 }}
}/* 分离偶数,留下全是奇数的顺序表 */
/* &list指的是要被分离的顺序表 */
void sepEven(SqlList &list){int i=0;// 计数器while(i<list.length){if(list.a[i]%2==0){for(int m=i;m<list.length-1;m++){list.a[m]=list.a[m+1];}list.length--;}else{i++;}}
} int main() {SqlList list,list2;// 声明一个顺序表createList(list); // 创建顺序表 printSqlList(list);// 打印创建成功的顺序表 sepOdd(list);// 分离奇数留下偶数列表 printSqlList(list);// 打印偶数顺序表 createList(list2); // 创建顺序表 printSqlList(list2);// 打印创建成功的顺序表 sepEven(list2);// 分离偶数留下奇数列表 printSqlList(list2);// 打印奇数顺序表 return 0;
}

结果如下:

考研数据结构之线性表(1.7)——练习题之分离单链表的奇数偶数(C表示)相关推荐

  1. 【数据结构】线性表的链式表示-循环单链表、循环双链表、静态链表

    循环单链表 从任何一个结点出发都能访问到链表的每一个元素 判空条件不是头节点的后继指针是否为空,而是它是否等于头指针 有时对单链表常做的操作实在表头和表尾进行的,此时可对循环单链表不设头指针而仅设尾指 ...

  2. php数据结构链表代码,数据结构之线性表——链式存储结构之单链表(php代码实现)...

    /** * * 1. 类LNode用作创建单链表时,生成新的节点. * 2. 类SingleLinkList用于创建单链表以及对单链表的一些操作方法(实例化此类就相当于创建了一个空链表) * 3. C ...

  3. 数据结构之线性表——链式存储结构之单链表(php代码实现)

    <?php /**** 1. 类LNode用作创建单链表时,生成新的节点.* 2. 类SingleLinkList用于创建单链表以及对单链表的一些操作方法(实例化此类就相当于创建了一个空链表)* ...

  4. 线性表中的尾插法单链表的学习

    #include <stdio.h> #include <malloc.h>/*** 线性表中的尾插法单链表的学习 *//*** 人类*/ typedef struct Per ...

  5. 2022年考研数据结构_2 线性表

    https://gitee.com/fakerlove/Data-Structure 文章目录 2. 线性表 一.单链表 二.循环链表 三.双向链表 2. 线性表 一.单链表 单链表是链表的基础,链表 ...

  6. 数据结构第三篇——线性表的链式存储之单链表

    ♥注:未经博主同意,不得转载. 线性表的链式存储结构的特点是用一组任意的存储单元来存储线性表的数据元素,这些单元可以分散在内存中的任意位置上,其在物理上可以是连续的,也可以是不连续的.具有链式存储结构 ...

  7. 线性表之链式存储结构_单链表相关算法

    在存储结构上,不需要连续的存储空间,需要上一个结点的指针域 指向下一个结点即可,找到一个结点就可以找到下一个结点. 学习教材是大话数据结构,加上自己的一些个人理解.这个算法 有点绕,需要对指针 相关内 ...

  8. 线性表的基本操作及应用(单链表的创建、插入、删除、查找、显示)

    1.实现单链表的创建:2.实现单链表的插入:3.实现单链表的删除:4.实现单链表的查找:5.实现单链表的显示 #include <stdio.h> #include <stdlib. ...

  9. 考研数据结构之线性表(1.7)——练习题之A和B两个顺序表中相同元素组成一个新的从大到小的有序顺序表C的算法(C表示)

    题目 设A和B是两个顺序表,其元素按递增的顺序排列.编写一个将A和B中相同元素组成一个新的从大到小的有序顺序表C的算法. 分析 在归并算法的基础上稍加改动,只需要将当前扫描到的相等元素归入C表即可. ...

最新文章

  1. Silverlight C# 游戏开发:Silverlight开发环境
  2. 0x51.动态规划 - 线性DP(习题详解 × 10)
  3. KVM — 安装部署
  4. FreeMarker 自动转义和格式化HTML和XML输出,预防xss
  5. 散分,并如何判断时间段上有重叠冲突。
  6. JavaScript历史与ECMAScript
  7. 2018年的AI/ML惊喜及预测19年的走势(二)
  8. 猎豹浏览器禁止跟踪怎么开启 禁止跟踪功能开启方法
  9. 作者:黄玲玲(1982-),女,博士,安徽省公共交通安全科学研究院副研究员。...
  10. tortoise从服务器获取项目_项目中一次网络问题处理的复盘
  11. 大神降临(公历1982年11月24号)
  12. ACL2021奇葩标题大赏
  13. crawl spider
  14. 过程FMEA步骤四:失效分析(一)
  15. CSDN是什么?——我的博客漫漫成长之路
  16. logo版权注册流程
  17. 前端面试题型汇总(适合应届/社招1年水平)
  18. Python数据分析-绘图-3-Bokeh交互式绘图-1-基本构成与语法
  19. vue-cli通过symbol引用阿里iconfont图标
  20. mnist数据集百度云链接

热门文章

  1. 数字校园建设方案技术建议书
  2. MySQL-索引及其原理
  3. java中的arrayList(动态数组)与静态数组
  4. netty之微信-群聊的发起与通知(十八)
  5. php取FBOX数据,云平台制作(1)-OPC Client取数模块的制作
  6. 树莓派csi摄像头检测不到,没有/dev/video0,supported=0 detected=0等问题的解决方法
  7. FPGA设计中,产生LFSR伪随机数
  8. 如何微信多开(PC端微信多开)
  9. jacob xls与xlsx格式互转
  10. 县域远程医疗解决方案