前言

由于是出成绩后一段时间写的,已经有点遗忘当时遇到的情况,同时该代码不是最优解,需要精简代码的同学可以想想办法解决奇偶长度和有时候头结点不为空的问题,这样就可以极大程度上解决我这个代码的冗余。

题目

【202201007】试写一算法,从某个结点p开始,双向交错遍历一条双向循环链表。规定如下:

  1. 先从p的next指针域方向最先开始访问;然后访问p的prior域;再访问p的next域...。
  2. 已知每个结点的data域只含一个字符。每访问一个结点,就将该结点的data域打印出来。必须使用"%c"格式的printf函数打印。
  3. 不打印头结点的data域。如果遍历到头结点,则需沿当前遍历方向,继续前进至下一个结点,并打印该结点的data域。
  4. 结点p的data域最后打印,但是如果p是指向头结点,则不打印。
  5. 请勿使用printf函数打印其它多余字符,否则可能会导致输出校验出错

举例:规定头结点为第0个结点,例如从下表中第3个结点开始遍历时:打印结果为:TLAQRCMF

0 1 2 3 4 5 6 7 8
  Q L F T A R M C

实现以下函数:从结点p开始,双向交错遍历L。

void InterleavedTravelDuCirLinkList(DuCirLinkList L, DuLNode* p)

已知双向循环链表的结构体定义:

typedef char  ElemType;

typedef struct DuLNode {

ElemType  data;

struct DuLNode  *prior, *next; //分别指向直接前驱和直接后继

} DuLNode, *DuLinkList; //双向链表

typedef DuLinkList DuCirLinkList; // 双向循环链表

解析

以下为我模糊的回忆:

在一开始我考虑到了奇偶的问题,用的do...while语句来进行指针移动的,后面碰到一些奇奇怪怪的问题就全部重写了一遍。

首先考虑空链表和只有一个元素的链表

于是可以写出以下代码:

if(L->next==L)
return; if(L->next->next==L)
{
printf("%c",L->next->data);
return;
}

虽说这个也有些问题,在anyview系统中,生成的测试数据是有没有头结点的情况存在的,也就是说下一个元素和上一个元素都是自己。可以考虑再加一个或者合并在之前的代码。

if(L->next==L)
{
printf("%c",L->data);
return;
}

接着便是处理正常的情况

我这里偷懒了不想想太多,遍历得到整个链表的长度

int sum=0;    //链表长度
int search=0; //遍历元素个数
DuLinkList length,pre,rear;
length=L->next;
pre=p->prior;
rear=p->next; while(length!=L)
{
sum++;
length=length->next;
}

获得链表长度后可以开始遍历了,这里依旧偷懒,反正就是当两个指针相遇就结束

while(1)
{
if(rear==pre && pre==L && rear==L)
break; if(rear==L)
rear=rear->next; //因为偷懒不考虑奇偶长度问题,所以每次移动指针都要检查是否相遇
if(pre==rear)
break;
printf("%c",rear->data);
search++;
rear=rear->next; if(pre==rear)
break;
if(pre==L)
pre=pre->prior;
if(pre==rear)
break;
printf("%c",pre->data);
search++;
pre=pre->prior; if(pre==rear)
break;
}

最后就是对最后一个元素输出做处理

if(sum-2==search)
{
printf("%c",pre->data);
search++;
}
if(search==sum-1 && p==L)
printf("%c",pre->data); if(search==sum-1 && p!=L)
printf("%c",p->data);

测试数据

双向循环链表:QQYQQQ,起始结点位置(头结点位标为【0】):【0】
你的结果:QQQQYQ
系统结果:QQQQYQ
========RIGHT========
双向循环链表:QQYQQQ,起始结点位置(头结点位标为【0】):【1】
你的结果:QQYQQQ
系统结果:QQYQQQ
========RIGHT========
双向循环链表:QQYQQQ,起始结点位置(头结点位标为【0】):【2】
你的结果:YQQQQQ
系统结果:YQQQQQ
========RIGHT========
双向循环链表:QQYQQQ,起始结点位置(头结点位标为【0】):【3】
你的结果:QQQQQY
系统结果:QQQQQY
========RIGHT========
双向循环链表:QQYQQQ,起始结点位置(头结点位标为【0】):【4】
你的结果:QYQQQQ
系统结果:QYQQQQ
========RIGHT========
双向循环链表:QQYQQQ,起始结点位置(头结点位标为【0】):【5】
你的结果:QQQYQQ
系统结果:QQQYQQ
========RIGHT========
双向循环链表:QQYQQQ,起始结点位置(头结点位标为【0】):【6】
你的结果:QQQQYQ
系统结果:QQQQYQ
========RIGHT========
双向循环链表:OODODOO,起始结点位置(头结点位标为【0】):【0】
你的结果:OOOODDO
系统结果:OOOODDO
========RIGHT========
双向循环链表:OODODOO,起始结点位置(头结点位标为【0】):【1】
你的结果:OODOODO
系统结果:OODOODO
========RIGHT========
双向循环链表:OODODOO,起始结点位置(头结点位标为【0】):【2】
你的结果:DOOODOO
系统结果:DOOODOO
========RIGHT========
双向循环链表:OODODOO,起始结点位置(头结点位标为【0】):【3】
你的结果:OODOOOD
系统结果:OODOOOD
========RIGHT========
双向循环链表:OODODOO,起始结点位置(头结点位标为【0】):【4】
你的结果:DDOOOOO
系统结果:DDOOOOO
========RIGHT========
双向循环链表:OODODOO,起始结点位置(头结点位标为【0】):【5】
你的结果:OOODOOD
系统结果:OOODOOD
========RIGHT========
双向循环链表:OODODOO,起始结点位置(头结点位标为【0】):【6】
你的结果:ODOOODO
系统结果:ODOOODO
========RIGHT========
双向循环链表:OODODOO,起始结点位置(头结点位标为【0】):【7】
你的结果:OOODDOO
系统结果:OOODDOO
========RIGHT========
双向循环链表:WWWORQR,起始结点位置(头结点位标为【0】):【0】
你的结果:WRWQWRO
系统结果:WRWQWRO
========RIGHT========
双向循环链表:WWWORQR,起始结点位置(头结点位标为【0】):【1】
你的结果:WRWQORW
系统结果:WRWQORW
========RIGHT========
双向循环链表:WWWORQR,起始结点位置(头结点位标为【0】):【2】
你的结果:WWORRQW
系统结果:WWORRQW
========RIGHT========
双向循环链表:WWWORQR,起始结点位置(头结点位标为【0】):【3】
你的结果:OWRWQRW
系统结果:OWRWQRW
========RIGHT========
双向循环链表:WWWORQR,起始结点位置(头结点位标为【0】):【4】
你的结果:RWQWRWO
系统结果:RWQWRWO
========RIGHT========
双向循环链表:WWWORQR,起始结点位置(头结点位标为【0】):【5】
你的结果:QORWWWR
系统结果:QORWWWR
========RIGHT========
双向循环链表:WWWORQR,起始结点位置(头结点位标为【0】):【6】
你的结果:RRWOWWQ
系统结果:RRWOWWQ
========RIGHT========
双向循环链表:WWWORQR,起始结点位置(头结点位标为【0】):【7】
你的结果:WQWRWOR
系统结果:WQWRWOR
========RIGHT========
双向循环链表:CJCCCTCW,起始结点位置(头结点位标为【0】):【0】
你的结果:CWJCCTCC
系统结果:CWJCCTCC
========RIGHT========
双向循环链表:CJCCCTCW,起始结点位置(头结点位标为【0】):【1】
你的结果:JWCCCTCC
系统结果:JWCCCTCC
========RIGHT========
双向循环链表:CJCCCTCW,起始结点位置(头结点位标为【0】):【2】
你的结果:CCCWCCTJ
系统结果:CCCWCCTJ
========RIGHT========
双向循环链表:CJCCCTCW,起始结点位置(头结点位标为【0】):【3】
你的结果:CJCCTWCC
系统结果:CJCCTWCC
========RIGHT========
双向循环链表:CJCCCTCW,起始结点位置(头结点位标为【0】):【4】
你的结果:CCTJCCWC
系统结果:CCTJCCWC
========RIGHT========
双向循环链表:CJCCCTCW,起始结点位置(头结点位标为【0】):【5】
你的结果:TCCCWJCC
系统结果:TCCCWJCC
========RIGHT========
双向循环链表:CJCCCTCW,起始结点位置(头结点位标为【0】):【6】
你的结果:CCWCCCJT
系统结果:CCWCCCJT
========RIGHT========
双向循环链表:CJCCCTCW,起始结点位置(头结点位标为【0】):【7】
你的结果:WTCCJCCC
系统结果:WTCCJCCC
========RIGHT========
双向循环链表:CJCCCTCW,起始结点位置(头结点位标为【0】):【8】
你的结果:CCJTCCCW
系统结果:CCJTCCCW
========RIGHT========
双向循环链表:FRRRRR,起始结点位置(头结点位标为【0】):【0】
你的结果:FRRRRR
系统结果:FRRRRR
========RIGHT========
双向循环链表:FRRRRR,起始结点位置(头结点位标为【0】):【1】
你的结果:RRRRRF
系统结果:RRRRRF
========RIGHT========
双向循环链表:FRRRRR,起始结点位置(头结点位标为【0】):【2】
你的结果:RFRRRR
系统结果:RFRRRR
========RIGHT========
双向循环链表:FRRRRR,起始结点位置(头结点位标为【0】):【3】
你的结果:RRRFRR
系统结果:RRRFRR
========RIGHT========
双向循环链表:FRRRRR,起始结点位置(头结点位标为【0】):【4】
你的结果:RRRRFR
系统结果:RRRRFR
========RIGHT========
双向循环链表:FRRRRR,起始结点位置(头结点位标为【0】):【5】
你的结果:RRFRRR
系统结果:RRFRRR
========RIGHT========
双向循环链表:FRRRRR,起始结点位置(头结点位标为【0】):【6】
你的结果:FRRRRR
系统结果:FRRRRR
========RIGHT========
双向循环链表:ZZAXZDZ,起始结点位置(头结点位标为【0】):【0】
你的结果:ZZZDAZX
系统结果:ZZZDAZX
========RIGHT========
双向循环链表:ZZAXZDZ,起始结点位置(头结点位标为【0】):【1】
你的结果:ZZADXZZ
系统结果:ZZADXZZ
========RIGHT========
双向循环链表:ZZAXZDZ,起始结点位置(头结点位标为【0】):【2】
你的结果:AZXZZDZ
系统结果:AZXZZDZ
========RIGHT========
双向循环链表:ZZAXZDZ,起始结点位置(头结点位标为【0】):【3】
你的结果:XZZZDZA
系统结果:XZZZDZA
========RIGHT========
双向循环链表:ZZAXZDZ,起始结点位置(头结点位标为【0】):【4】
你的结果:ZADZZZX
系统结果:ZADZZZX
========RIGHT========
双向循环链表:ZZAXZDZ,起始结点位置(头结点位标为【0】):【5】
你的结果:DXZAZZZ
系统结果:DXZAZZZ
========RIGHT========
双向循环链表:ZZAXZDZ,起始结点位置(头结点位标为【0】):【6】
你的结果:ZZZXZAD
系统结果:ZZZXZAD
========RIGHT========
双向循环链表:ZZAXZDZ,起始结点位置(头结点位标为【0】):【7】
你的结果:ZDZZAXZ
系统结果:ZDZZAXZ
========RIGHT========
双向循环链表:S,起始结点位置(头结点位标为【0】):【0】
你的结果:S
系统结果:S
========RIGHT========
双向循环链表:S,起始结点位置(头结点位标为【0】):【1】
你的结果:S
系统结果:S
========RIGHT========
双向循环链表:空双向循环链表,起始结点位置(头结点位标为【0】):【0】
你的结果:
系统结果:
========RIGHT========

完整代码

void InterleavedTravelDuCirLinkList(DuCirLinkList L, DuLNode* p)
{
if(L->next==L)
return; if(L->next->next==L)
{
printf("%c",L->next->data);
return;
} if(L->next==L)
{
printf("%c",L->data);
return;
} int sum=0;
int search=0;
DuLinkList length,pre,rear;
length=L->next;
pre=p->prior;
rear=p->next; while(length!=L)
{
sum++;
length=length->next;
} while(1)
{
if(rear==pre && pre==L && rear==L)
break;
if(rear==L)
rear=rear->next;
if(pre==rear)
break;
printf("%c",rear->data);
search++;
rear=rear->next;
if(pre==rear)
break;
if(pre==L)
pre=pre->prior;
if(pre==rear)
break;
printf("%c",pre->data);
search++;
pre=pre->prior;
if(pre==rear)
break;
} if(sum-2==search)
{
printf("%c",pre->data);
search++;
} if(search==sum-1 && p==L)
printf("%c",pre->data); if(search==sum-1 && p!=L)
printf("%c",p->data);
}

广工Anyview【DC02PE97】解析的更多相关文章

  1. Android反编译基础(apktoos)--广工图书馆APK

    更多精彩内容 :http://www.chenchuangfeng.com QQ:375061590 ------------------------------------------------- ...

  2. zyb的面试(广工14届比赛)

    这道题目在上半年ZOJ模拟上年青岛赛区ACM题的时候就已经出现了.当时我不会写,本来想着赛后补题的最后因为懒惰又没补. 现在这道题又出现了.这是上天对我的惩罚啊!!! 所以这次铁了心也要补这题.然后我 ...

  3. 【HDU6216】 A Cubic number and A Cubic Number 和 广工的加强版

    题目传送门_杭电版 题目传送门_广工版 广工版的是杭电版的加强版. 题意:判断一个质数是否是两个整数的立方差 ---- 数学题 题解: 根据立方差公式:\(a^3 - b^3 = (a - b)(a^ ...

  4. 广工赛-hdu6468构造十叉树

    是个以前没见过的模板题.. 我用比较复杂度方式过掉了.. 构造一个十叉树(有点trie的味道)来存数字,然后字典序就是先序遍历的结果 #include<bits/stdc++.h> usi ...

  5. 广工赛-hdu6469-树链压缩/二分

    比较复杂的一题.. 不管是二分答案还是直接做,都需要压缩树链 /* 给定n种怪物,每个怪物有属性a[i] 打死第i种怪物后,第i只怪物会分裂成a[i]个第i-1种怪 如果打死的是第1种,那么获得经验a ...

  6. 广工赛-hdu6470矩阵快速幂

    递推时把(n+1)^3拆开 构造矩阵即可 #include<bits/stdc++.h> using namespace std; #define ll long long #define ...

  7. 广工十四届校赛 count 矩阵快速幂

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6470 题意:求,直接矩阵快速幂得f(n)即可 构造矩阵如下: n^3是肯定得变换的,用二项式展开来一点 ...

  8. Count(广工14届竞赛)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6470 这道题目题解就扔了个矩阵快速幂啥都没写.....这题解是太看得懂我这个弱鸡了. 既然是矩阵快速幂 ...

  9. 广工2017校赛-F-- tmk找三角

    http://gdutcode.sinaapp.com/problem.php?cid=1056&pid=5 Description 有一棵树,树上有只tmk.他在这棵树上生活了很久,对他的构 ...

  10. SCNU ACM 2016新生赛初赛 解题报告

    新生初赛题目.解题思路.参考代码一览 1001. 无聊的日常 Problem Description 两位小朋友小A和小B无聊时玩了个游戏,在限定时间内说出一排数字,那边说出的数大就赢,你的工作是帮他 ...

随机推荐

  1. kubelet忽然不可用

    原因,有可能机器的cpu信息有变化(扩容或者缩容)解决办法: 删掉/opt/var/lib/kubelet目录下(或者/data/lib/kubelet)cpu_manager_state文件 然后m ...

  2. 关于Position Encoding 的理解

    encoding Sinusoidal Position Encoding \[\begin{aligned} P E_{(p o s, 2 i)} &=\sin \left(\frac{p ...

  3. 实例解读丨关于GaussDB ETCD服务异常

    摘要:本文通过对ETCD服务异常问题分析,代码展示解决方案. 本文分享自华为云社区<[实例状态]GaussDB ETCD服务异常>,作者:酷哥. 首先确认是否是虚拟机.网络故障 虚拟机故障 ...

  4. JK触发器与模12计数器

    JK触发器 JK触发器具有保持,置0,置1和翻转四个功能. 则可得出次态方程:\(Q_{n+1} = JQ_n'+K'Q_n\) Design `timescale 1ns / 1ps module ...

  5. echarts标题(title)配置

    var option = {         //标题         title : {             show:true,//显示策略,默认值true,可选为:true(显示) | fa ...

  6. 万字干货_JDK动态代理及其源码解析 拿捏了

    目录 代理模式 静态代理 静态代理和动态代理的区别?什么是静态.动态? 静态代理的使用步骤 示例 静态代理的缺陷 解决静态代理的缺陷的思路 JDK动态代理 JDK 动态代理类使用步骤 示例 底层原理 ...

  7. 16、有n个正数,使得前面每个数依次后移m个位置,最后m个数变成最前面m个数

    /* 有n个正数,使得前面每个数依次后移m个位置,最后m个数变成最前面m个数 */ #include <stdio.h> #include <stdlib.h> #define ...

  8. ArrayList中的ConcurrentModificationException,并发修改异常,fail-fast机制。

    一:什么时候出现? 当我们用迭代器循环list的时候,在其中用list的方法新增/删除元素,就会出现这个错误. package com.sinitek.aml; import java.util.Ar ...

  9. linux 挂载 vdi 文件(virtual box虚拟机镜像文件)

    1. 下载 vdfuse 下载地址 2.解压deb文件 解压deb安装包文件,这里不使用安装命令是因为你的virtualbox 可能和vdfuse的版本不一致,导致安装失败,而我们只需要用到 vdfu ...

  10. js-day02-综合案例ATM存款书写

     <script>                 // 1. 不断的弹出对话框         // 3. 金额的变量         let money = 100         w ...