SortLinkList proc
local n:dword ; 局部变量n
mov n,0 ; 设初值为0
mov ebx,st_head ; 遍历链表
a10: ; 求得链表中元素个数 -> n
cmp ebx,0
jz a20 ; n为链表中元素的个数
inc n ; n加1
mov ebx,(student ptr [ebx]).next ; 取下一个节点
jmp a10 ; 继续处理
a20: ; 外层循环,将n个节点中的最小元素放在链表的最后
cmp n,1
jbe a60 ; n <= 1时,不必排序
mov ebx,st_head ; EBX指向第1个节点
lea edi,st_head ; [EDI]指向结点EBX
mov ecx,n ; n >= 2
dec ecx ; 内层循环,循环n-1次
a30: ; 内层循环,如果相邻两个元素中前一个元素的分数较低,则交换位置
mov esi,(student ptr [ebx]).next;EBX->节点x,ESI->节点y
mov ax,(student ptr [ebx]).score;
cmp ax,(student ptr [esi]).score; 比较节点x、y的分数
jge a40 ; 节点x的分数高,不交换
; 节点x与节点y的在链表中的顺序进行交换
mov [edi],esi ; ① 节点y替代x的位置
mov eax,(student ptr [esi]).next; ② 节点y的后继节点作
mov (student ptr [ebx]).next,eax; ② 为节点x的后继节点
mov (student ptr [esi]).next,ebx; ③ x作为y的后继节点
lea edi,(student ptr [esi]).next;[EDI]是指向x的指针
;mov ebx,(student ptr [esi]).next;EBX不变,继续处理节点x
jmp a50 ; 继续
a40: ; 节点x与节点y的顺序不变
lea edi,(student ptr [ebx]).next ; [EDI]指向节点x
mov ebx,(student ptr [ebx]).next ; EBX指向下一个节点
a50,
loop a30 ; 内层循环
dec n ; n减1
jmp a20 ; 外层循环
a60,
ret
SortLinkList endp