СТРУКТУРЫ И АЛГОРИТМЫ ОБРАБОТКИ ДАННЫХ
Лабораторная 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;
}