Algorithms
Title image

СТРУКТУРЫ И АЛГОРИТМЫ ОБРАБОТКИ ДАННЫХ


Лабораторная 1 структуры и алгоритмы обработки данных

Наработки кода

Оригинальный пример из учебника для решения задачи [КОД 1]:

#define WORD struct word_type
#include<stdio.h>
#include<stdlib.h>
WORD
{
    int TAG; /* признак: 1 - карта повернута лицевой стороной вниз */
    /* 0 - карта повернута лицевой стороной вверх */
    int SUIT; /* масть: 1 - трефы, 2 - бубны, 3 - черви, 4 - пики */
    int RANK; /* ранг: 1, 2, ...,13 - туз, двойка, ..., король */
    WORD *NEXT; /* следующий */
};
void main()
{
    int N;
    WORD *TOP, /* указатель на верхний элемент стека */
         *NEWCARD, /* указатель на новый элемент стека */
         *X; /* указатель на текущий элемент стека */
    /* Создание пустого стека */
    TOP=NULL;
    /* Помещение нижней карты в пустую стопку */

    NEWCARD=(WORD *)malloc(sizeof(WORD));
    printf("NEWCARD=%p\n",NEWCARD);
    /*A1*/ NEWCARD->NEXT=TOP;
    /*A2*/ TOP=NEWCARD;
    /*A3*/ TOP->TAG=1; TOP->SUIT=1; TOP->RANK=10;

    /* Добавление новой карты в стопку сверху */
    NEWCARD=(WORD *)malloc(sizeof(WORD));
    printf("NEWCARD=%p\n",NEWCARD);
    /*A1*/ NEWCARD->NEXT=TOP;
    /*A2*/ TOP=NEWCARD;
    /*A3*/ TOP->TAG=0; TOP->SUIT=4; TOP->RANK=3;

    /* Добавление вехней карты в стопку */
    NEWCARD=(WORD *)malloc(sizeof(WORD));
    printf("NEWCARD=%p\n",NEWCARD);
    /*A1*/ NEWCARD->NEXT=TOP;
    /*A2*/ TOP=NEWCARD;
    /*A3*/ TOP->TAG=0; TOP->SUIT=2; TOP->RANK=2;
    
    printf("TAG(TOP)=%d\n",TOP->TAG);
    printf("SUIT(TOP)=%d\n",TOP->SUIT);
    printf("RANK(NEXT(TOP))=%d\n",TOP->NEXT->RANK);
    /* Подсчет количества карт в стопке */
B1:
    N=0; X=TOP;
B2:
    if(X==NULL) goto end;
B3:
    N++; X=X->NEXT; goto B2;
end:
    printf("N = %d\n", N);
}

Пример моего кода (по сути, проведен рефакторинг кода из учебника (кода 1), что-то выведено в отдельные функции, где-то goto метки заменены while циклом и т.д.), по заданным значениям и результату код идентичен коду выше [КОД 2]:

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

#define CARD struct card_type

CARD {
    int tag; 
    int suit; 
    int rank;
    CARD *next;
};

bool create_card(CARD** top, CARD** newcard,
                 int tag, int suit, int rank) {
    
    (*newcard) = (CARD*)malloc(sizeof(CARD));
    printf("newcard = %p\n", (*newcard));
    
    (*newcard)->next = (*top);
    (*top) = (*newcard);
    (*top)->tag  = tag;
    (*top)->suit = suit;
    (*top)->rank = rank;

    return true;
}

bool show_card(CARD* top) {
    if (top != NULL) {
        printf("tag(top) = %d\n", top->tag);
        printf("suit(top) = %d\n", top->suit);
        if (top->next != NULL) {
            printf("rank(next(top)) = %d\n", top->next->rank);
        }
    }

    return true;
}

int count_cards(CARD* top, CARD* x) {
    x = top;

    int i = 0;
    while (x != NULL) {
        i++;
        x = x->next;
    }

    return i;
}


int main(void) {
    CARD* top     = NULL;
    CARD* newcard = NULL;
    CARD* x       = NULL;

    create_card(&top, &newcard, 1, 1, 10);
    create_card(&top, &newcard, 0, 4, 3);
    create_card(&top, &newcard, 0, 2, 2);

    show_card(top);

    printf("count: %d\n", count_cards(top, x));

    return 0;
}

А это третья вариация кода, она идентична коду (код 2), но в main функции добавлены статические массивы и объявлена константная переменная CARD_AMOUNT, что позволяет ещё легче использовать код для разных вариантов. Этот код использован для решения варианта 14 из учебника [КОД 3]:

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

#define CARD struct card_type

CARD {
    int tag; 
    int suit; 
    int rank;
    CARD *next;
};

bool create_card(CARD** top, CARD** newcard,
                 int tag, int suit, int rank) {
    
    (*newcard) = (CARD*)malloc(sizeof(CARD));
    printf("newcard = %p\n", (*newcard));
    
    (*newcard)->next = (*top);
    (*top) = (*newcard);
    (*top)->tag  = tag;
    (*top)->suit = suit;
    (*top)->rank = rank;

    return true;
}

bool show_card(CARD* top) {
    if (top != NULL) {
        printf("tag(top) = %d\n", top->tag);
        printf("suit(top) = %d\n", top->suit);
        if (top->next != NULL) {
            printf("rank(next(top)) = %d\n", top->next->rank);
        }
    }

    return true;
}

int count_cards(CARD* top, CARD* x) {
    x = top;

    int i = 0;
    while (x != NULL) {
        i++;
        x = x->next;
    }

    return i;
}


#define CARD_AMOUNT 4

int main(void) {
    CARD* top     = NULL;
    CARD* newcard = NULL;
    CARD* x       = NULL;

    int tag[CARD_AMOUNT]  = {0};
    int suit[CARD_AMOUNT] = {3, 3, 1, 4};
    int rank[CARD_AMOUNT] = {8, 9, 10, 10};

    for (int i = 0; i < CARD_AMOUNT; ++i) {
        create_card(&top, &newcard, tag[i], suit[i], rank[i]);
    }

    show_card(top);

    printf("count: %d\n", count_cards(top, x));

    return 0;
}
Изображение задания 13 варианта