lists.pas 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. Unit LIsts;
  2. Interface
  3. {----------------=-=-=-=----------------}
  4. {----------------=-=-=-=----------------}
  5. {----------------=-=-=-=----------------}
  6. type PList=^List;
  7. List=record
  8. val : integer;
  9. next : Plist;
  10. end;
  11. Procedure AddItem(var Li:PList; item:integer; num : word);
  12. Procedure DeleteItem(var Li:PList;num:word);
  13. Function ListCount(Li:PList):word;
  14. Procedure Sort(var Li:PList);
  15. Function GetItem(Li:PList;num:word):integer;
  16. {----------------=-=-=-=----------------}
  17. {----------------=-=-=-=----------------}
  18. {----------------=-=-=-=----------------}
  19. Implementation
  20. {----------------=-=-=-=----------------}
  21. Procedure AddItem(var Li:PList; item:integer; num : word);
  22. var
  23. FF,La:PList;
  24. i:word;
  25. begin
  26. La := Li;
  27. New(FF);
  28. FF^.val := item;
  29. if num=1 then
  30. begin
  31. FF^.next := Li;
  32. Li := FF;
  33. end
  34. else if ListCount(Li)<num then
  35. begin
  36. while La^.next<>nil do La:=La^.next;
  37. FF^.next := nil;
  38. La^.next := FF;
  39. end
  40. else
  41. begin
  42. for i:= 3 to num do La := La^.next;
  43. FF^.next := La^.next;
  44. La^.next := FF;
  45. end;
  46. end;
  47. {----------------=-=-=-=----------------}
  48. Procedure DeleteItem(var Li:PList;num:word);
  49. var tm,tm2 : PList;i:word;
  50. begin
  51. if num > ListCount(Li) then Exit;
  52. if num=1 then
  53. begin
  54. tm := Li^.next;
  55. dispose(Li);
  56. Li := tm;
  57. end
  58. else
  59. begin
  60. tm := Li;
  61. for i:=3 to num do tm:=tm^.next;
  62. tm2:=tm^.next;
  63. tm^.next := tm2^.next;
  64. dispose(tm2);
  65. end;
  66. end;
  67. {----------------=-=-=-=----------------}
  68. Function ListCount(Li:PList):word;
  69. var TM:Plist;i,ret:word;
  70. begin
  71. Tm := Li;
  72. if Li=nil then ret:=0
  73. else begin ret:=1;
  74. while tm^.next<>nil do begin tm:=tm^.NEXT; inc(ret);end;
  75. end;
  76. ListCount:=ret;
  77. end;
  78. Function GetItem(Li:PList;num:word):integer;
  79. var i:word; La : PList;
  80. begin
  81. La:=Li;
  82. if ListCount(Li)>=num then begin
  83. for i := 2 to num do La:=La^.next;
  84. GetItem := La^.val;
  85. end else
  86. GetItem:=-1;
  87. end;
  88. Procedure Sort(var Li:PLIST);
  89. var
  90. newli,k,ends2:plist;
  91. begin
  92. New(newli);
  93. newli^.val := li^.val;
  94. newli^.next := nil;
  95. k := li^.next;
  96. Dispose(li);
  97. li := k;
  98. k := newli;
  99. repeat
  100. while (k^.val > li^.val) and (k^.next <> nil) do k := k^.next;
  101. if (k^.next = nil) and (k^.val > li^.val) then
  102. begin
  103. New(ends2);
  104. ends2^.next := nil;
  105. ends2^.val := li^.val;
  106. k^.next := ends2;
  107. end
  108. else
  109. begin
  110. New(ends2);
  111. ends2^.next := k^.next;
  112. k^.next := ends2;
  113. ends2^.val := k^.val;
  114. k^.val := li^.val;
  115. end;
  116. k := li^.next;
  117. Dispose(li);
  118. li := k;
  119. k := newli;
  120. until li = nil;
  121. li := newli;
  122. end;
  123. end.