前言

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

题目

【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. 7.httprunner-pytest风格用例

    用例设计原则 py文件名以test_开头或者_test结尾 函数名以test_开头 类名以Test开头,并且不能有init初始化方法 所有的包pakege必须有_init_.py文件   pychar ...

  2. Vitepress搭建组件库文档(上)—— 基本配置

    在 vite 出现以前,vuepress 是搭建组件库文档不错的工具,支持以 Markdown 方式编写文档.伴随着 vite 的发展,vitepress 已经到了 1.0.0-alpha.22 版本 ...

  3. 我的 React 最佳实践

    There are a thousand Hamlets in a thousand people's eyes. ----- 威廉·莎士比亚 免责声明:以下充满个人观点,辩证学习 React 目前开 ...

  4. SimpleDateFormat线程安全问题排查

    一. 问题现象 运营部门反馈使用小程序配置的拉新现金红包活动二维码,在扫码后跳转至404页面. 二. 原因排查 首先,检查扫码后的跳转链接地址不是对应二维码的实际URL,根据代码逻辑推测,可能是acc ...

  5. for in 和 for of 的区别和v-for指令的三种使用方法

    for...in 循环:只能获得对象的键名,不能获得键值 for...of 循环:允许遍历获得键值 var arr = ['red', 'green', 'blue'] for(let item in ...

  6. day17-Servlet06

    Servlet06 15.HttpServletResponse 15.1HttpServletResponse介绍 每次HTTP请求,Tomcat都会创建一个HttpServletResponse对 ...

  7. C#和Open eVision Studio图像库联合编程-读取图像

    OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Filter = "Image Files (*.t ...

  8. 使用vite + vue3 + ant-design-vue + vue-router + vuex 创建一个后台管理应用

    使用vite + vue3 + ant-design-vue + vue-router + vuex 创建一个管理应用的记录 使用vite 创建项目 我创建的node 版本是 v16.17.1 使用N ...

  9. php zip下载附件到压缩包并浏览器下载

    /** * 下载图片并生成压缩包 * @param $arr 资源数组 * @return string */ function downloadZipImg($arr) {if(is_array($ ...

  10. 快速构建一个简单的Springboot-web项目

    web项目基本的核心成分 数据落地 MYSQL数据库 登录标识 JWT :{Java web token } 记录有效登录状态 以及缓存常用数据: Redis 数据库与JAVA实体的快速自动映射ORM ...