[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[其他] [已解决]批处理可以建立链表吗?

本帖最后由 dengyuli 于 2015-5-26 18:01 编辑

链表的优势是:插入、删除元素比较方便
下面给出我做的单向链表:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. :head
  4. cls
  5. set /p n=请输入元素个数:
  6. set /a n-=1
  7. if !n! leq 0 goto :head
  8. rem 头结点名称
  9. set "h=!random!!time::=!"
  10. rem ----------
  11. set /p %h%.data=
  12. set "str=!random!!time::=!"
  13. set %h%.next=!str!
  14. if !n!==0 set %h%.next=nil
  15. for /l %%a in (1,1,!n!) do (
  16.     for %%b in (!str!) do (
  17.      set /p %%b.data=
  18.      if %%a neq !n! (set "%%b.next=!random!!time::=!") else (set %%b.next=nil)
  19.      set str=!%%b.next!
  20.     )
  21. )
  22. echo head id^:!h!
  23. echo !%h%.data!
  24. echo next^:!%h%.next!
  25. echo=
  26. if !%h%.next!==nil goto :f
  27. set str=!%h%.next!
  28. :x
  29. rem 按顺序显示出链表中的各个元素
  30. for %%b in (!str!) do (
  31.   echo id^:%%b
  32.   echo !%%b.data!
  33.   echo next^:!%%b.next!
  34.   echo=
  35.   set str=!%%b.next!
  36.   if "!str!"=="nil" goto :f
  37. )
  38. goto :x
  39. :f
  40. endlocal
  41. pause
复制代码
不知道这算不算是模拟链表。
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

本帖最后由 dengyuli 于 2015-5-24 11:46 编辑

应用:解决约瑟夫问题
题目:N个猴子围成一圈,从第一个开始报数,第M个将被淘汰,最后剩下一个,其余猴子都将被淘汰。例如N=6,M=5,被淘汰掉的顺序是:5,4,6,2,3,1。剩下最后一个可以当选猴群的大王。
代码如下:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set /p n=请输入猴子数量:
  4. set /p m=请输入报道几就退出的数:
  5. set /a m-=1
  6. set "h=!random!!time::=!"
  7. set str=!h!
  8. for /l %%a in (1,1,!n!) do (
  9. for %%b in (!str!) do (
  10.   set %%b.data=%%a
  11.   set "%%b.next=!random!!time::=!"
  12.   if %%a==!n! set %%b.next=!h!
  13.   set str=!%%b.next!
  14. )
  15. )
  16. set ctr=1
  17. :bs
  18. set /a "mod=ctr %% m"
  19. if !mod! neq 0 (
  20. for %%a in (!str!) do (
  21.   set str=!%%a.next!
  22. )
  23. ) else (
  24. for %%a in (!str!) do (set t=!%%a.next!)
  25. for %%a in (!t!) do (
  26.   set t=!%%a.next!
  27.   echo !%%a.data!号已淘汰。
  28.   set "%%a.data="
  29.   set "%%a.next="
  30. )
  31. for %%a in (!str!) do (
  32.   set %%a.next=!t!
  33.   set str=!t!
  34. )
  35. set ctr=0
  36. )
  37. set /a ctr+=1
  38. for %%a in (!str!) do (if !%%a.next!==%%a goto :f)
  39. goto :bs
  40. :f
  41. for %%a in (!str!) do (
  42. echo 最终当选大王的是:!%%a.data!号
  43. )
  44. endlocal
  45. pause
复制代码
当猴子数量越多时,处理得就越慢,处理到后面就会越来越快。

TOP

算法貌似有点不对哦
20,3
正确输出应该为16,而你输出了20
这是批处理贴吧群里的凡心写过的一段代码,很简洁
  1. @echo off& setlocal enabledelayedexpansion
  2. set number=20
  3. for /l %%i in (1,1,%number%) do set __tmp1=!__tmp1! %%i
  4. :st
  5. set a=
  6. set __tmp=%__tmp1%
  7. set __tmp1=
  8. set count=
  9. for  %%i in (%__tmp%) do (
  10. set /a a+=1
  11. set /a "1/(!a! %% 3)" 2>nul && (set /a count+=1&set __tmp1=%%i !__tmp1!)
  12. )
  13. if !count! == 2 (goto end) else (goto st)
  14. :end
  15. for %%i in (%__tmp1%) do set win=%%i&goto win
  16. :win
  17. echo %win%
  18. pause
复制代码
不同的语言有自己不同的特性,刻意去模仿别的语言反倒会导致代码冗长且效率低下
(比如我初学C的时候思考过该怎么实现变量嵌套......)
1

评分人数

TOP

此方法效率低下的原因是随机分配变量名
我自己笔算了一下,没有错误
这个问题可以精简到一个公式,效率可以更高

TOP

n = 总数
q = 步进
z = 起始位置
  1. @echo off&setlocal enabledelayedexpansion
  2. set/a n=20,q=3,z=1,x=z-1
  3. for /l %%i in (%z% 1 !n!) do set "code=!code!,%%i"
  4. for /l %%i in (1 1 !x!) do set "code=!code!,%%i"
  5. set "code=!code!,"
  6. :lp
  7. for %%i in (!code!) do (
  8.     set /a "m+=1,r=m %% q"
  9.     if !r! equ 0 (
  10.        set /a num+=1
  11.        if !n! equ !num! goto end
  12.        set "code=!code:,%%i,=,!"
  13.     )
  14. )
  15. goto :lp
  16. :end
  17. set "s=!code:,=!"
  18. echo;!s!
  19. pause
复制代码
起始位置 1
  1. @echo off&setlocal enabledelayedexpansion
  2. set/a n=20,s=1,q=3
  3. if %n% equ %s% set p=1
  4. :lp
  5. for /l %%i in (!s! 1 !n!) do (
  6.     if not defined %%i (
  7.        set/a m+=1,t=m%%q
  8.        if !t! equ 0 (set %%i=%%i)else set/a str=%%i,p+=1,n=%%i,s=1
  9.        if defined %%i echo,!%%i!
  10.     )
  11. )
  12. if !p! gtr 1 set p=&goto lp
  13. echo 最后剩下的是原来的 !str! 号
  14. pause
复制代码
1

评分人数

TOP

返回列表