Составить функцию Add2End, которая добавляет элемент E в конец списка - C (СИ)
Формулировка задачи:
Я студент 1-го курса Информатики, впервые начал изучение языка C, до этого экспериментировал немного на Java, поэтому возникли некоторые трудности с изучением нового языка. В общем, на первой контрольной попались 3 задания, решения которых у меня крутятся в голове, но никак не могу сложить их воедино, и в конечном итоге я ничего не написал. Писать нужно было на бумаге, а не в редакторе, поэтому проверить скомпилируется, а главное, заработает ли код, возможности не было, поэтому не стал писать белиберду.
Решать эти задания я никого не заставляю, но если кто-то проявит хоть какой-то интерес, буду очень благодарен за любую оказанную помощь, т.к. мне самому интересно как это работает, и все равно придется исправлять это на исправительной контрольной
В общем вот само задание:
Имеются 2 структуры данных:
1. Составить функцию
typedef struct Element { int ID_1; int ID_2; struct Element* Prev; struct Element* Next; } typedef struct List { int elements_amount; struct Element* First; struct Element* Last; }
Add2End
, которая добавляет элемент E в конец списка Lvoid Add2End(List* L, Element* E)
. 2. Составить функциюEqual_ID
которая возвращает количество элементов в списке L, для которых ID_1 и ID_2 имеют одинаковое значение,int Equal_ID(Lista* L)
. 3. Написать функциюJoin
которая добавляет в конец списка L1 элементы из списка L2,void Join(List* L1, List* L2)
. P.S. переводил задания с польского, поэтому мог допустить где-нибудь ошибку.Решение задачи: «Составить функцию Add2End, которая добавляет элемент E в конец списка»
textual
Листинг программы
#include <stdio.h> #include <string.h> #include <locale.h> #include <stdlib.h> typedef struct _Element{ int ID_1; int ID_2; struct _Element *Prev; struct _Element *Next; }Element; typedef struct{ int element_amount; Element *First; Element *Last; }List; void Create(List *); void Destroy(List *); void Add2End(List *, Element *); int Equal_ID(List *); void Join(List *, List *); void ShowElement(Element *); void ShowList(List *); int main(int argc, char *argv[]) { setlocale(LC_ALL, "RU"); List L1, L2; Create(&L1); printf("Вводите элементы 1 списка в формате \"ID_1 ID_2\"\n"); printf("Конец ввода - ввод пустой строки\n"); while(1){ char str[128]; gets(str); if(!strcmp(str, "")){ break;} Element *e = (Element *)malloc(sizeof(Element)); sscanf(str, "%d %d", &e->ID_1, &e->ID_2); Add2End(&L1, e); } printf("Количество элементов в списке, для которых ID_1 = ID_2 равно %d\n", Equal_ID(&L1)); Create(&L2); printf("Вводите элементы 2 списка в формате \"ID_1 ID_2\"\n"); printf("Конец ввода - ввод пустой строки\n"); while(1){ char str[128]; gets(str); if(!strcmp(str, "")){ break;} Element *e = (Element *)malloc(sizeof(Element)); sscanf(str, "%d %d", &e->ID_1, &e->ID_2); Add2End(&L2, e); } Join(&L1, &L2); printf("Результат объединения двух списков\n"); ShowList(&L1); Destroy(&L1); return 0; } void Create(List *l) { l->element_amount = 0; l->First = l->Last = NULL; } void Destroy(List *l) { while(l->First){ l->Last = l->First; l->First = l->First->Next; free(l->Last);} l->element_amount = 0; l->First = l->Last = NULL; } void Add2End(List *l, Element *e) { if(!l->First){ l->First = e; l->First->Prev = NULL;} else{ l->Last->Next = e; e->Prev = l->Last;} e->Next = NULL; l->Last = e; (l->element_amount)++; } int Equal_ID(List *l) { int count = 0; Element *curr = l->First; while(curr){ if(curr->ID_1 == curr->ID_2){ ++count;} curr = curr->Next;} return count; } void Join(List *l1, List *l2) { l1->Last->Next = l2->First; l2->First->Prev = l1->Last; l1->Last = l2->Last; } void ShowElement(Element *e) { if(!e){ return;} printf("%d\t%d\n", e->ID_1, e->ID_2); } void ShowList(List *l) { Element *curr = l->First; while(curr){ ShowElement(curr); curr = curr->Next;} }
Объяснение кода листинга программы
В этом коде реализована функция Add2End, которая добавляет элемент E в конец списка. Функция принимает два аргумента: указатель на список list и указатель на элемент E. Список представлен структурой List, которая содержит следующие поля:
- element_amount — количество элементов в списке;
- First — указатель на первый элемент списка;
- Last — указатель на последний элемент списка. Структура Element представляет собой элемент списка и содержит следующие поля:
- ID_1 - первый идентификатор элемента;
- ID_2 - второй идентификатор элемента;
- Prev — указатель на предыдущий элемент списка;
- Next — указатель на следующий элемент списка.
Функция Add2End добавляет элемент E в конец списка следующим образом:
- Если список пуст, то новый элемент становится первым.
- Если список не пуст, то новый элемент добавляется в конец списка. При этом новый элемент связывается с последним элементом списка следующим образом: новый элемент —> предыдущий элемент списка —> новый элемент.
- Новый элемент не имеет указателя на предыдущий элемент, так как он становится последним в списке.
- Указатель на последний элемент списка обновляется, чтобы указывать на новый элемент.
- Указатель на количество элементов в списке увеличивается на 1. Другие функции в коде используются для ввода элементов списка, вывода списка, проверки идентичности элементов списка и объединения двух списков.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д