Реализуйте пузырьковую сортировку для массива структур - PullRequest
0 голосов
/ 27 ноября 2018

Я пытаюсь отсортировать массив структур, и у меня возникают проблемы с правильной сортировкой массива.Я пытался использовать указатель арифметики, memcpy и массив обозначений для сортировки.Есть ли правильный способ сделать это?Результатом является только первая запись, скопированная на все из них.

void bubblesort(struct Record *ptr, int records,
        int (*fcomp)(const void *, const void *))
{
        int swapped;
        int i = 0;
        struct Record *tmp;
        struct Record *tmp1;
        do {
                swapped =0;
                for(i=0;i<records-1;i++){
                        if(fcomp(ptr+i,ptr+i+1)>0){
                                swapped = 1;
                                tmp = ptr+i;
                        /*      tmp1 = ptr+i+1;
                                ptr[i]= *tmp1;
                                ptr[i+1] = *tmp;
                                */
                        //      tmp->seqnum = ptr[i].seqnum;
                        //      tmp->threat = ptr[i].threat;
                        //      tmp->addrs[0] = ptr[i].addrs[0];
                        //      tmp->addrs[1] = ptr[i].addrs[1];
                        //      tmp->ports[0] = ptr[i].ports[0];
                        //      tmp->ports[1] = ptr[i].ports[1];
                        //      strcpy(tmp->dns_name,ptr[i].dns_name);
                                ptr[i].seqnum = ptr[i+1].seqnum;
                                ptr[i].threat = ptr[i+1].threat;
                                ptr[i].addrs[0] = ptr[i+1].addrs[0];
                                ptr[i].ports[0] = ptr[i+1].ports[0];
                                ptr[i].addrs[1] = ptr[i+1].addrs[1];
                                ptr[i].ports[1] = ptr[i+1].ports[1];
                                strcpy(ptr[i].dns_name ,ptr[i+1].dns_name);

                                ptr[i+1].seqnum = tmp->seqnum;
                                ptr[i+1].threat = tmp->threat;
                                ptr[i+1].addrs[0] = tmp->addrs[0];
                                ptr[i+1].ports[0] = tmp->ports[0];
                                ptr[i+1].addrs[1] = tmp->addrs[1];
                                ptr[i+1].ports[1] = tmp->ports[1];
                                strcpy(ptr[i+1].dns_name,tmp->dns_name);


                        }
                }
        }
`

1 Ответ

0 голосов
/ 28 ноября 2018

Вы должны использовать структурные назначения, потому что они радикально более компактны, чем повторные назначения для каждого элемента структуры.Например:

struct Record
{
    int seqnum;
    int threat;
    int addrs[2];
    int ports[2];
    char dns_name[32];
};

void bubblesort(struct Record *ptr, int records,
                int (*fcomp)(const void *, const void *))
{
    int swapped;
    do
    {
        swapped = 0;
        for (int i = 0; i < records - 1; i++)
        {
            if (fcomp(ptr + i, ptr + i + 1) > 0)
            {
                swapped = 1;
                struct Record tmp = ptr[i];
                ptr[i] = ptr[i + 1];
                ptr[i + 1] = tmp;
            }
        }
    } while (swapped != 0);
}

Обратите внимание, что в этом коде временное значение tmp является структурой, а не указателем на структуру.

Вы также опустили условие while (swapped != 0); иТрейлинг } в коде в вопросе.Я положил их путем вывода.Этот код компилируется.Я не запускал его - я просто уменьшил код обмена до трех строк с 21 или около того.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...