Перебор элементов динамического списка - C (СИ)
Формулировка задачи:
задача программы:
находит сумму последнего и предпоследнего элементов списка L, содержащего не менее двух элементовпостановка задачи:
Элементы списка должны вводиться с клавиатуры и размещаться в динамической памяти. как сделать перебор элементов динамического списка? это для того чтобы можно было определить последнее и предпоследнее числоРешение задачи: «Перебор элементов динамического списка»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <assert.h>
typedef struct list {
int data;
struct list * next;
} list_t, *list_ptr;
char ch1, str[100];
int i, count = 0;
struct list *x = NULL;
int sum_last(list_ptr first) {
list_ptr ptr;
assert(NULL != first);
assert(NULL != first->next);
for (ptr = first; ptr->next->next; ptr = ptr->next) {}
return ptr->data + ptr->next->data;
}
void show(struct list *a) {
char wrd[100];
while (a != NULL) {
strcpy(wrd, a->data);
a = a->next;
printf(" %s\t", wrd);
}
}
void add(struct list **a, char m[100]) {
struct list *b = (struct list *)malloc(sizeof(struct list));
strcpy(b->data, m);
b->next = NULL;
if (*a == NULL)
*a = b;
else {
struct list *t = *a;
while (t->next != NULL)
t = t->next;
t->next = b;
}
}
int main()
{
char c, c1;
int i, j, min;
while (!(c == 27))
{
system("cls");
printf(" Enter - run the program.\n");
printf(" Esc - exit.\n");
printf(" Any other key - information about program.\n");
c = getch();
system("cls");
switch (c)
{
case 27:
break;
case 13:
{
system("cls");
printf("It\'s time to fill the first list (to end the filling eneter ***)\n\n");
for (i = 0; ; i++) {
printf("Enter the data:\n>>");
do
{
gets(str);
if (strlen(str) == 0) printf("You've entered an empty string. Try again:\n>> ");
} while (strlen(str) == 0);
if (strcmp(str, "***") == 0) break;
add(&x, str);
count++;
}
if (count == 0) printf("\nThe first list is empty.\n");
else printf("Elements in your first list are:\n");
show(x);
printf("\n\n\nPress \'Enter\' to continue");
getch();
sum_last(x);
x = NULL;
printf("\n\tEsc - exit.\n");
printf("\tAny other - go to the main page.\n");
c = getch();
break;
}
default:
{
printf("\n Finds the sum of the last and penultimate elements of the list L containing at least two elements.\n\n");
printf(" Esc - exit.\n");
printf(" Any other - go to the main page.\n");
c = getch();
break;
}
}
}
return 0;
}
Объяснение кода листинга программы
В этом коде представлена программа, которая создает и манипулирует динамическим списком, используя указатели. Вот список функций и переменных:
sum_last(list_ptr first): Эта функция находит сумму последнего и предпоследнего элементов списка.show(struct list *a): Эта функция отображает элементы списка.add(struct list **a, char m[100]): Эта функция добавляет новый элемент в список.main(): Это точка входа в программу. Она содержит основной цикл программы и несколько вложенных циклов для добавления данных в список и отображения списка. Вот список номеров строк и их соответствующих функций или переменных:- 16:
sum_last(list_ptr first) - 18:
show(struct list *a) - 22:
add(struct list **a, char m[100]) - 35:
main()Вот список вызовов функций и переменных: - Строка 17:
sum_last(x)используется для вычисления суммы последнего и предпоследнего элементов списка. - Строка 19:
show(x)используется для отображения элементов списка. - Строка 23:
add(&x, str)используется для добавления нового элемента в список. - Строка 36:
main()является точкой входа в программу. Вот список действий: - Создать новый элемент списка.
- Добавить новый элемент в список.
- Вычислить сумму последнего и предпоследнего элементов списка.
- Отобразить элементы списка.
- Продолжить выполнение цикла, пока не будет введен символ
***, указывающий на конец ввода данных. - Проверить, пуст ли список.
- Если список пуст, вывести сообщение.
- Продолжить выполнение цикла, пока не будет введен символ
***, указывающий на конец ввода данных. - Выйти из программы.