广工Anyview【DC02PE97】解析
前言
由于是出成绩后一段时间写的,已经有点遗忘当时遇到的情况,同时该代码不是最优解,需要精简代码的同学可以想想办法解决奇偶长度和有时候头结点不为空的问题,这样就可以极大程度上解决我这个代码的冗余。
题目
【202201007】试写一算法,从某个结点p开始,双向交错遍历一条双向循环链表。规定如下:
- 先从p的next指针域方向最先开始访问;然后访问p的prior域;再访问p的next域...。
- 已知每个结点的
data域只含一个字符。每访问一个结点,就将该结点的data域打印出来。必须使用"%c"格式的printf函数打印。 - 不打印头结点的
data域。如果遍历到头结点,则需沿当前遍历方向,继续前进至下一个结点,并打印该结点的data域。 - 结点p的
data域最后打印,但是如果p是指向头结点,则不打印。 - 请勿使用
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】解析的更多相关文章
- Android反编译基础(apktoos)--广工图书馆APK
更多精彩内容 :http://www.chenchuangfeng.com QQ:375061590 ------------------------------------------------- ...
- zyb的面试(广工14届比赛)
这道题目在上半年ZOJ模拟上年青岛赛区ACM题的时候就已经出现了.当时我不会写,本来想着赛后补题的最后因为懒惰又没补. 现在这道题又出现了.这是上天对我的惩罚啊!!! 所以这次铁了心也要补这题.然后我 ...
- 【HDU6216】 A Cubic number and A Cubic Number 和 广工的加强版
题目传送门_杭电版 题目传送门_广工版 广工版的是杭电版的加强版. 题意:判断一个质数是否是两个整数的立方差 ---- 数学题 题解: 根据立方差公式:\(a^3 - b^3 = (a - b)(a^ ...
- 广工赛-hdu6468构造十叉树
是个以前没见过的模板题.. 我用比较复杂度方式过掉了.. 构造一个十叉树(有点trie的味道)来存数字,然后字典序就是先序遍历的结果 #include<bits/stdc++.h> usi ...
- 广工赛-hdu6469-树链压缩/二分
比较复杂的一题.. 不管是二分答案还是直接做,都需要压缩树链 /* 给定n种怪物,每个怪物有属性a[i] 打死第i种怪物后,第i只怪物会分裂成a[i]个第i-1种怪 如果打死的是第1种,那么获得经验a ...
- 广工赛-hdu6470矩阵快速幂
递推时把(n+1)^3拆开 构造矩阵即可 #include<bits/stdc++.h> using namespace std; #define ll long long #define ...
- 广工十四届校赛 count 矩阵快速幂
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6470 题意:求,直接矩阵快速幂得f(n)即可 构造矩阵如下: n^3是肯定得变换的,用二项式展开来一点 ...
- Count(广工14届竞赛)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6470 这道题目题解就扔了个矩阵快速幂啥都没写.....这题解是太看得懂我这个弱鸡了. 既然是矩阵快速幂 ...
- 广工2017校赛-F-- tmk找三角
http://gdutcode.sinaapp.com/problem.php?cid=1056&pid=5 Description 有一棵树,树上有只tmk.他在这棵树上生活了很久,对他的构 ...
- SCNU ACM 2016新生赛初赛 解题报告
新生初赛题目.解题思路.参考代码一览 1001. 无聊的日常 Problem Description 两位小朋友小A和小B无聊时玩了个游戏,在限定时间内说出一排数字,那边说出的数大就赢,你的工作是帮他 ...
随机推荐
- DevOps|从特拉斯辞职风波到研发效能中的不靠谱人干的荒唐事
今天发生了一件大事特拉斯辞任英国首相,我想借着这件事情说下我看到的一件研发效能的荒唐事,这其中的关联也许就是「都用了不靠谱的人」. 两件事情 今儿一早就听到,2022年10月20日英国第78任首相伊丽 ...
- 【pytest官方文档】解读- 开发可pip安装的第三方插件
在上一篇的 hooks 函数分享中,开发了一个本地插件示例,其实已经算是在编写插件了.今天继续跟着官方文档学习更多知识点. 一个插件包含一个或多个钩子函数,pytest 正是通过调用各种钩子组成的插件 ...
- html中可以写php代码,但是文件后缀名需要是.php而不是.html。否则php程序不会被解析执行。
html中可以写php代码,但是文件后缀名需要是.php而不是.html.否则php程序不会被解析执行. <div class="goods_title"><?p ...
- nodered获取简单的时间
1.添加simpletime 的节点 2. 添加一个inject节点用来每1s循环获取当点的信息 3.添加一个函数节点对simpletime发来的msg进行解析 var payload=msg;var ...
- Linux环境下执行脚本重启Weblogic控制台中部署的应用程序
之前有写过一篇博文介绍切换登录方式的脚本,脚本中存在一个缺点:仍需手动去Weblogic控制台重启应用程序:本文即介绍如何在脚本中更新Weblogic控制台中部署的应用程序. 一.配置Weblogic ...
- Terminal(oh-my-zsh) 美化
如果你使用Mac进行开发,那么Terminal.app应该是你使用非常频繁的app了.初体验Terminal时你可能觉得单调乏味,阅读密密麻麻的内容也很费劲.但是如果你跟着我一起配置它,就会发现你平时 ...
- DevExpress窗体加载等待
using DevExpress.XtraEditors; using DevExpress.XtraSplashScreen; using System; using System.Collecti ...
- 在 Tomcat 10.x 上部署 SpringMVC 5.x
在Tomcat10.x 上部署 SpringMVC 5.x的时候,项目一直无法访问 运行截图 原因 Tomcat10基于Jakarta EE 9,其中api的包名已经从javax更改到jakarat ...
- 少走点弯路:Wiki.js 通过 Generic OAuth2 进行身份验证
Wiki.js介绍 Wiki.js 是一个开源的百科全书系统,可以用来搭建自己的知识库.文档库等. 官网 | GitHub 后续内容中的Wiki.js会用Wiki代替. 本文环境:Wiki 2.5.2 ...
- Go语言核心36讲09
从本篇文章开始,我们正式进入了模块2的学习.在这之前,我们已经聊了很多的Go语言和编程方面的基础知识,相信你已经对Go语言的开发环境配置.常用源码文件写法,以及程序实体(尤其是变量)及其相关的各种概念 ...