Составить функцию Add2End, которая добавляет элемент E в конец списка - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Я студент 1-го курса Информатики, впервые начал изучение языка C, до этого экспериментировал немного на Java, поэтому возникли некоторые трудности с изучением нового языка. В общем, на первой контрольной попались 3 задания, решения которых у меня крутятся в голове, но никак не могу сложить их воедино, и в конечном итоге я ничего не написал. Писать нужно было на бумаге, а не в редакторе, поэтому проверить скомпилируется, а главное, заработает ли код, возможности не было, поэтому не стал писать белиберду. Решать эти задания я никого не заставляю, но если кто-то проявит хоть какой-то интерес, буду очень благодарен за любую оказанную помощь, т.к. мне самому интересно как это работает, и все равно придется исправлять это на исправительной контрольной В общем вот само задание: Имеются 2 структуры данных:
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;
}
1. Составить функцию

Add2End

, которая добавляет элемент E в конец списка L

void 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. Если список пуст, то новый элемент становится первым.
    2. Если список не пуст, то новый элемент добавляется в конец списка. При этом новый элемент связывается с последним элементом списка следующим образом: новый элемент —> предыдущий элемент списка —> новый элемент.
    3. Новый элемент не имеет указателя на предыдущий элемент, так как он становится последним в списке.
    4. Указатель на последний элемент списка обновляется, чтобы указывать на новый элемент.
    5. Указатель на количество элементов в списке увеличивается на 1. Другие функции в коде используются для ввода элементов списка, вывода списка, проверки идентичности элементов списка и объединения двух списков.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 3.6 из 5
Похожие ответы