广工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无聊时玩了个游戏,在限定时间内说出一排数字,那边说出的数大就赢,你的工作是帮他 ...
随机推荐
- 齐博x1标签之异步加载标签数据
为什么要异步加载标签?他有什么好处 如果一个页面的标签太多,又或者是页面中某一个标签调用数据太慢的话,就会拖慢整个页面的打开,非常影响用户体验.这个时候,用异步加载的话,就可以一块一块的显示,用户体验 ...
- 知识图谱-生物信息学-医学顶刊论文(Briefings in Bioinformatics-2021):生物信息学中的图表示学习:趋势、方法和应用
4.(2021.6.24)Briefings-生物信息学中的图表示学习:趋势.方法和应用 论文标题: Graph representation learning in bioinformatics: ...
- import cv2报错
其实是没错的,不过有的python编译器对这个不太支持,把import cv2 改为import cv2.cv2 as cv2就行了.
- jQuery $.fn.extend()方法类插件
一.为JQuery原型扩展新的属性和方法,然后在JQuery的实例对象上调用 在 jQuery 中,我们可以使用$.fn.extend()方法来定义一个方法类插件.方法类插件就是首先你使用 jQuer ...
- vue-axios更改操作
<template> <div class="nav"> <label for="">新部门</label>&l ...
- docker清空网络配置
docker 网络 故障 相同的 ip 绑定给了 两个 网卡, 需要 清空 网络 ip addr | grep 10.79 inet 10.79.106.1/24 brd 10.79.106.255 ...
- 嵌入式-C语言基础:字符串拼接函数strcat
#include<stdio.h> #include <string.h> //实现字符串拼接 char * mystrcat(char * dest,char * src) ...
- 2.mysql-库表行管理
1.数据库管理 1.1 SQL语句 1.1.1 查看当前所有的数据库 show databases; 1.1.2 创建数据库 create database 数据库名; create databse ...
- C++初阶(vector容器+模拟实现)
迭代器 四种迭代器 容器类名::iterator 迭代器名;//正向迭代器 容器类名::const_iterator 迭代器名;//常量正向迭代器,const修饰,只能用于读取容器内的元素,不能改变其 ...
- C温故补缺(十六):未定义行为
未定义行为 在计算机程序设计中,未定义行为是指执行某种计算机代码 所产生的结果,这种代码在当前程序状态下的行为在其所使用的语言标准中没有规定. 以C语言为例,未定义行为指C语言标准未作规定的行为,同时 ...