Премини към съдържанието

Препоръчан отговор


Здравейте, имам следният код някой ще може ли да ми го обясни.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

struct element {
    int val;
    element* next;   
};

struct list {
    element* start;
};

list* init() {
    list* l = (list*)malloc(sizeof(list));
    l->start = nullptr;
    return l;
}

bool is_empty(list* l) {
    return (l->start == nullptr);
}

bool in_list(list* l, int v) {
    if(l->start == nullptr)
        return 0;

    element* iter = l->start;
    while(iter != nullptr) {
        if(iter->val == v) 
            return 1;
        iter = iter->next;
    }
    return 0;
}

void push_front(list* l, int v) {
    element* e = (element*)malloc(sizeof(element));
    e->val = v;
    e->next = l->start;
    l->start = e;
}

int pop_front(list* l) {
    int v = l->start->val;
    element* e = l->start;
    l->start = e->next;

    free(e);
    return v;
}

void push_back(list* l, int v) {
    element* iter = l->start;
    if(iter == nullptr)
        return push_front(l, v);

    while(iter->next != nullptr)
        iter = iter->next;

    element* e = (element*)malloc(sizeof(element));
    e->val = v;
    e->next = nullptr;
    iter->next = e;
}

int pop_back(list* l) {
    element* iter = l->start;

    if(iter->next == nullptr)
        return pop_front(l);

    while(iter->next->next != nullptr)
        iter = iter->next;

    int v = iter->next->val;
    element* e = iter->next;
    iter->next = nullptr;

    free(e);
    return v;
}

int count(list* l, int v) {
    int count = 0;
    element* iter = l->start;
    while(iter != nullptr) {
        if(iter->val == v)
            count++;
        iter = iter->next;
    }
    return count;
}

int most_freq(list* l) {
    list* uniques = init();

    element* iter = l->start;
    while(iter != nullptr) {
        int v = iter->val;
        if(!in_list(uniques, v)) {
            int curr_count = count(l, v);
            if(!is_empty(uniques) && curr_count > count(l, uniques->start->val))
                push_front(uniques, v);
            else
                push_back(uniques, v);
            // printf("%d has %d occurrences\n", v, curr_count);
        }
        iter = iter->next;
    }

    return uniques->start->val;
}

int main(int argc, char** argv) {
    srand(time(NULL));

    list* l = init();
    for(int i = 0; i < 30; i++) {
        push_back(l, ((rand() % 10) + 1));
    }

    printf("Most occurrences: %d\n", most_freq(l));

    printf("List: ");
    while(!is_empty(l)) {
        printf("%d ", pop_back(l));
    }

    printf("\n"); system("pause");
    return EXIT_SUCCESS;
}

 

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Накратко това е реализация на свързан списък (linked list). Повече информация (на анлгийски език) можеш да прочетеш тук:

http://www.codeproject.com/Articles/24684/How-to-create-Linked-list-using-C-C

Разбира се можеш да потърсиш още информация по въпроса.

При стартирането на програмата се запълва с 30 произволни числа, после се проверява кое число се среща най-често в списъка и накрая извежда списъка.

Не съм прочел кода в детайли, но в общи линий това прави.

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Регистрирайте се или влезете в профила си за да коментирате

Трябва да имате регистрация за да може да коментирате това

Регистрирайте се

Създайте нова регистрация в нашия форум. Лесно е!

Нова регистрация

Вход

Имате регистрация? Влезте от тук.

Вход

×

Информация

Поставихме бисквитки на устройството ви за най-добро потребителско изживяване. Можете да промените настройките си за бисквитки, или в противен случай приемаме, че сте съгласни с нашите условия за ползване.