C语言进阶-第19讲:链表应用(拆分链表)
2017-11-17 10:07
841 查看
任务和代码:
编写一个函数将一个头指针为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
运行结果:
分析过程:
编写一个函数将一个头指针为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; }
运行结果:
分析过程:
相关文章推荐
- C语言进阶-第19讲:链表应用(链表版通讯录)
- C语言进阶-第19讲:链表应用(链表的合并)
- C语言进阶-第 4000 19讲:链表应用(改造链表)
- C语言的单链表面试题----进阶
- C语言进阶-第32讲:位运算及其应用
- 算法精解_C语言 链表_单链表(应用:页帧管理)
- 线性表(二)——单链表(3)——单链表应用举例(1)—— 拆分单链表
- C语言及程序设计进阶例程-29 枚举类型及其应用
- 第3周实践项目5 -顺序表的应用 拆分单链表
- C语言及程序设计进阶例程-13 结构体数组及其应用
- 【碎片知识(2)· C语言】链表的建立、输出、特定点的删除和插入以及malloc函数的应用
- C语言及程序设计进阶例程-30 联合体及其应用
- linux内核之hlist哈希链表的应用---C语言代码实现(内核态)
- C语言指针五——指针应用:链表
- [C语言]进阶|链表
- C语言进阶之二级指针的应用:重置内存空间大小
- 单向链表及其应用(C语言)
- c语言实现单链表&二级指针在单链表的应用
- C语言----链表及其应用
- C语言及程序设计进阶例程-32 位运算及其应用