hw笔试题-02

#include<stdio.h>
#include<string.h>

typedef struct
{
    char *mem;
    char  len;
}m_table_t;

int table_cmp(m_table_t *p1, m_table_t *p2)
{
    int ret;
    if(p1->len == p2->len)
        return memcmp(p1->mem, p2->mem, p1->len);
    if(p1->len > p2->len)
        ret = memcmp(p1->mem, p2->mem, p2->len);
    else
        ret = memcmp(p1->mem, p2->mem, p1->len);
    if(0 == ret)
        return p1->len - p2->len;
    
    return ret;
}

void sort(m_table_t *a, int num)
{
    int i,j;
    m_table_t temp;
    for(i=0;i<num;i++)
    {
        for(j=0;j<num;j++)
        {
            if( table_cmp(&a[j], &a[j+1] ) > 0)
            {
                memcpy( &temp,  &a[j],    sizeof(m_table_t) );
                memcpy( &a[j],  &a[j+1],  sizeof(m_table_t) );
                memcpy( &a[j+1], &temp,   sizeof(m_table_t) );
            }
        }
    }
}

void quickSort(m_table_t *s, int l, int r)
{
    int i, j;
    m_table_t x;
    if (l < r)
    {
        i = l; j = r; 
        memcpy(&x, &s[i], sizeof(m_table_t) );
        while (i < j)
        {
            while(i < j && (table_cmp(&s[j], &x) > 0)) j--;
            if(i < j)
            {
                memcpy( &s[i++], &s[j], sizeof(m_table_t) );
            }
            while(i < j && (table_cmp(&x, &s[i]) > 0 )) i++;
            if(i < j)
            {
                memcpy(&s[j--], &s[i], sizeof(m_table_t) );
            }    
        }
        memcpy(&s[i], &x, sizeof(m_table_t) );
        quickSort(s, l, i - 1);
        quickSort(s, i + 1, r);
    }
}

int str2table(m_table_t *table, char *str, int *index)
{
    int i,w;
    *index = 0;
    for(i=0,w= -1;  i<strlen(str); i++)
    {
        if(' ' != *(str+i) )
        {
            if( (-1 == w) )
            {
                w = i;//start
            }
        }
        else
        {
            if(-1 != w)//stop
            {
                table[*index].mem = str+w;
                table[*index].len = i - w;
                (*index)++;
                w = -1;
            }
        }
    }
    if(-1 != w)
    {
            table[*index].mem = str+w;
            table[*index].len = i - w;
            (*index)++;
            w = -1;
    }
    return 0;
}

void display(m_table_t *table, int index)
{
    int i;
    char tmp[15] = {0};
    for(i=0; i<index; i++)
    {
        memset(tmp, 0, 15);
        memcpy(tmp, table[i].mem, table[i].len);
        printf("%s
", tmp);
    }
    return;
}

int main(void )
{
    int index;
    char input[100] = {0};
    m_table_t g_table[15]= {0};
    
    gets(input);
    
    str2table(&g_table[0], input, &index);
    
    quickSort(&g_table[0], 0, index-1);//sort(&g_table[0], index-1);

    display(&g_table[0], index);
    return 0;
}
原文地址:https://www.cnblogs.com/to7str/p/4392406.html