C语言进阶-第19讲:链表应用(拆分链表)
来源:互联网 发布:淘宝vip客服 编辑:程序博客网 时间:2024/06/07 05:12
任务和代码:
编写一个函数将一个头指针为a的单链表A分解成两个单链表A和B,其头指针分别为a和b,使得A链表中含有原链表A中序号为奇数的元素,而B链表中含有原链表A中序号为偶数的元素,且保持原来的相对顺序。例,建立长度为7,元素为1 2 3 4 5 6 7的链表后,经拆分,得到两个数组A和B,其元素分别是1 3 5 7 和2 4 6
#include <stdio.h> #include <stdlib.h> typedef struct s { int date; struct s *link; } S; S *creat(int n) { S *p,*q,*head; head=p=q=malloc(sizeof(S)); scanf("%d",&p->date); while(--n) { p=malloc(sizeof(S)); scanf("%d",&p->date); q->link=p; q=p; } q->link=NULL; return head; } void play(S *h,int n) { S *p,*q,*h1=h,*h2=h->link; int i; for(p=h1,q=h2,i=0;i<(n+1)/2-1;i++) //(n+1)/2-1次使p遍历奇数结点,q遍历偶数结点 { p->link=p->link->link; q->link=q->link->link; /*奇数个结点下,p是最后一个奇数结点地址(最后一个结点),q=NULL 偶数个结点下,p是最后一个奇数结点地址(倒数第二个结点),q是最后一个偶数结点地址(最后一个结点)*/ p=p->link; q=q->link; } if(!(n%2)) //偶数个结点下 { /*保证最后一个结点的指针域是NULL*/ p->link=NULL; p=p->link; } for(p=h1;p!=NULL;){ //遍历每一个奇数结点 printf("%d ",p->date); p=p->link; } printf("\n"); for(p=h2;p!=NULL;){ //遍历每一个偶数结点 printf("%d ",p->date); p=p->link; } printf("\n"); } int main() { int n; scanf("%d",&n); play(creat(n),n); return 0; }
运行结果:
分析过程:
阅读全文
0 0
- C语言进阶-第19讲:链表应用(拆分链表)
- C语言进阶-第19讲:链表应用(链表的合并)
- C语言进阶-第19讲:链表应用(改造链表)
- C语言进阶-第19讲:链表应用(链表版通讯录)
- C语言进阶-第17讲:链表和数组的比较
- C语言进阶-第32讲:位运算及其应用
- C语言进阶-第15~16讲:结构体应用(学生成绩统计)
- C语言进阶-第15~16讲:结构体应用(玩转日期和时间)
- C语言进阶-第29讲:枚举类型及其应用(对称点)
- C语言及程序设计进阶例程-19 链表应用
- C语言进阶-第8~10讲:预处理
- C语言进阶-第24~28讲:算法概述
- 进阶项目12-链表的拆分
- C语言进阶-第6讲:递归法问题求解(易列写递归方程)
- C语言进阶-第6讲:递归法问题求解(两数的最大公约数)
- C语言进阶-第6讲:递归法问题求解(递归求数组的最大值)
- C语言进阶-第11~13讲:结构体(含数组和函数)
- C语言进阶-第15~16讲:结构体(含指针和函数)
- 【智能零售】解读双11后的新零售趋势
- C#利用开源库OpenHardwareMonitor获取CPU或显卡温度、使用率、时钟频率
- (1)python环境配置
- redis的集群
- android 基于ijkplayer项目进行的播放器
- C语言进阶-第19讲:链表应用(拆分链表)
- Socket在Java中的使用
- tomcat连接器参数和ssl配置
- opencv的mask
- Android 开源(记录一下自己的github开源小项目)
- 关于plsql远程链接Oracle报 “无法解析指定字符串”
- JavaScript 开发规范
- C#设计模式之代理模式(四)
- HTTP方法中GET、POST对比