Ask Question

Name:
Title:
Your Question:

Answer Question

Name:
Your Answer:
User Submitted Source Code!


Description:
  в
Language: C/C++
Code:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

typedef struct node{
  int key;
  struct node *next;
  struct node *prev;
}node;

typedef struct list{
  size_t size;
  node* begin;
  node* end;
}list;

node* node_init();
list* list_init();
void print_node();
void print_list();
void move_from_end_to_begin();
void add_to_begin();
void add_to_end();
void delete_list();
void node_delete_by_index();


//Инициализация элемента
node* node_init(int key){
  node* n = (node*) malloc(sizeof(node));
  if (n != NULL){
    n -> key = key;
    n -> next = NULL;
    n -> prev = NULL;
  } else{
    printf("malloc errorn");
  }
  return n;
}

//Инициализация списка
list* list_init(){
  list* l = (list*) malloc(sizeof(list));
  if (l != NULL){
    l -> size = 0;
    l -> begin = NULL;
    l -> end = NULL;
  } else{
    printf("malloc errorn");
  }
  return l;
}

//Печать элемента
void print_node(node* n){
  if(n!=NULL){
    printf("NODE:n[%d]n", n -> key);
  }else{
    printf("Ошибка!n");
  }
}

//Печать списка
void print_list(list* l){
  if(l!=NULL){
    printf("LIST:");
    node* n;
    for(n = l -> begin; n != NULL; n = n -> next){
      if(n -> next != NULL){
        printf("[%d] <-> ", n -> key);
      } else{
        printf("[%d]n", n -> key);
      }
    }
  }else{
    printf("Ошибка!n");
  }
}

//Сдвиг элемента из конца в начало списка
void move_from_end_to_begin(list* l){
  if(l!=NULL){
    l -> begin -> prev = l -> end;
    l -> end -> next = l -> begin;
    l -> end = l -> end -> prev;
    l -> end -> next = NULL;
    l -> begin = l -> begin -> prev;
    l -> begin -> prev = NULL;
  }else{
    printf("Ошибка!n");
  }
}

//Добавление элемента в начало списка
void add_to_begin(list* l, node* n){
  if(l!=NULL && n!=NULL){
    if(l -> size == 0){
      l -> begin = n;
      l -> end = n;
      l -> size = 1;
    } else{
      l -> begin -> prev = n;
      n -> next = l -> begin;
      l -> begin = n;
      l -> size ++;
    }
  }else{
    printf("Ошибка!n");
  }
}

//Добавление элемента в конец списка
void add_to_end(list* l, node* n){
  if(l!=NULL && n!=NULL){
    if(l -> size == 0){
      l -> begin = n;
      l -> end = n;
      l -> size = 1;
    } else{
      l -> end -> next = n;
      n -> prev = l -> end;
      l -> end = n;
      l -> size ++;
    }
  }else{
    printf("Ошибка!n");
  }
}

//Удаление списка
void delete_list(list* l){
  if(l!=NULL){
    node* tmp;
    for (tmp = l -> begin; tmp != NULL; tmp = tmp -> next) {
      free(tmp);
      //tmp = NULL;
    }
    free(l);
  }else{
    printf("Ошибка!n");
  }
}

//Удаление элемента из списка по индексу (index = 0 .. l -> size - 1)
void node_delete_by_index(list* l, int index){
  if(l!=NULL){
    node* tmp;
    int i;
    for (i = 0, tmp = l -> begin; tmp != NULL; i++, tmp = tmp -> next) {
      if (i == index) {
        if(tmp -> prev == NULL) {
          l -> begin = tmp -> next;
          free(tmp);
          l -> begin -> prev = NULL;
          l -> size = l -> size - 1;

        }else if(tmp -> next == NULL){
          l -> end = tmp -> prev;
          free(tmp);
          l -> end -> next = NULL;
          l -> size = l -> size - 1;

        }else{
          tmp -> prev -> next = tmp -> next;
          tmp -> next -> prev = tmp -> prev;
          free(tmp);

          l -> size = l -> size - 1;
        }
      }
    }
  }else{
    printf("Ошибка!n");
  }
}

int main(int argc, char const *argv[]) {
  //Инициализация эементов и списка
  node* a = node_init(8);
  node* b = node_init(17);
  node* c = node_init(4);
  node* d = node_init(0);
  list* l = list_init();

  //Добавление элементов в начало и конец списка
  add_to_begin(l,a);
  add_to_begin(l,b);
  add_to_end(l,c);
  add_to_end(l,d);

  //Печать списка
  print_list(l);

  //Сдвиг элемента из конца в начало списка
  printf("move_from_end_to_begin:n");
  print_list(l);
  move_from_end_to_begin(l);
  print_list(l);
  printf("n");

  //Удаление элемента из списка по индексу (index = 0 .. l -> size - 1)
  printf("node_delete_by_index:n");
  print_list(l);
  node_delete_by_index(l, 1);
  print_list(l);
  printf("n");

  //Удаление списка
  printf("delete_list:n");
  print_list(l);
  delete_list(l);
  l = NULL;
  printf("print_list after delete_list:n");
  print_list(l);
  return 0;
}

          
Comments: