下面的是一个大程序中的一个小程序  帮我分析一下 尽量详细 具体到每行就更好了

#include<stdio.h>
#include<io.h>
#include<string.h>
#include<stdlib.h>
#define L 5
#define H 20000
int hh;
int hjqs,hjqt;
int dsh;//倒数第几个数

int mfun2(int sj[][L],int n,int *ii)//从第ii行开始往上统计每行最后一个数共出现n个时再上面一行的所有数是否都是已出现过的那n个数;
                                    //成立返回1,不成立返回0,已到达数据顶部,无法再判断返回-1;并返回判断后停留的行号;
{
    int i,j;
    struct tt hjq={0,1,2,3,4,5,6,7,8,9,0};
    
    for(i=(*ii);1;i--)
    {   if(i<0)
        {
            //printf("-1 %d→%d\n",i,*ii);
            return -1;
        }
        else if(hjq.an==n)break;

        if(hjq.a[sj[i][L-dsh]]!=-1)
        {
            hjq.a[sj[i][L-dsh]]=-1;
            hjq.an++;
        }
    }

    //for(j=0;j<L;j++)
    //{
        if(hjq.a[sj[i][L-dsh]]!=-1)//检查该行倒数第dsh个数
        {
            //printf("0 %d→%d\n",i,*ii);
            *ii=i;
            return 0;
        }
    //}
    //printf("1 %d→%d\n",*ii,i);
    *ii=i;
    return 1;
}