Advertisement
Guest User

Untitled

a guest
May 20th, 2018
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.58 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4.  
  5. typedef struct Node {   //элемент списка
  6.     char* value;
  7.     Node* next;
  8. } Node;
  9.  
  10. typedef struct List {   //сам список
  11.     Node* head;
  12.     int length;
  13. } List;
  14.  
  15. List* create_list() {   //выделяет память и создает готовый для работы пустой список
  16.     List* new_list = (List*)malloc(sizeof(List));
  17.     new_list->head = NULL;
  18.     new_list->length = 0;
  19.     return new_list;
  20. }
  21.  
  22. void add(List* list, char* value) { //добавляет новый элемент в список
  23.     Node* new_node = (Node*)malloc(sizeof(Node));
  24.     new_node->value = value;
  25.     new_node->next = NULL;
  26.  
  27.     Node* temp = list->head;
  28.     if (temp == NULL) {
  29.         list->head = new_node;
  30.     }
  31.     else {
  32.         while (temp->next != NULL)
  33.             temp = temp->next;
  34.         temp->next = new_node;
  35.     }
  36.     list->length++;
  37. }
  38.  
  39. bool equal(char* first, char* second) { //проверяем ровны ле две строки
  40.     int i = 0;
  41.     while (first[i] != '\0' && second[i] != '\0') {
  42.         if (first[i] != second[i])
  43.             return false;
  44.         i++;
  45.     }
  46.     if (first[i] != '\0' || second[i] != '\0')
  47.         return false;
  48.     return true;
  49. }
  50.  
  51. void insert(List* L1, List* L2, char* E) {  //вставляет второй список в первый список после елемента Е
  52.     Node* temp = L1->head;
  53.     while (!equal(temp->value, E) && temp->next != NULL)    //находим Е или конец списка
  54.         temp = temp->next;
  55.     if (!equal(temp->value, E)) //если не нашли Е то уходим отсюда
  56.         return;
  57.  
  58.     Node* begin = L2->head;
  59.     Node* end = L2->head;
  60.     while (end->next != NULL)
  61.         end = end->next;
  62.    
  63.     end->next = temp->next; //конец второго списка указывает на следующий элемент
  64.     temp->next = begin;     //Е указывает на начало второго списка
  65.     L1->length += L2->length;
  66. }
  67.  
  68. void print_list(List* list) {   //выводит список
  69.     Node* temp = list->head;
  70.     while (temp != NULL) {
  71.         int i = 0;
  72.         while (temp->value[i] != '\0')
  73.             printf("%c", temp->value[i++]);
  74.         printf(" ");
  75.         temp = temp->next;
  76.     }
  77.     printf("\n");
  78. }
  79.  
  80. void main() {
  81.     List* L1 = create_list();
  82.     List* L2 = create_list();
  83.     char* E = (char*)malloc(sizeof(char));
  84.  
  85.     printf("L1: ");
  86.     char sym = '\0';
  87.     scanf("%c", &sym);
  88.     while (sym != '\0' && sym != '\n') {    //считываем перрвый спсиок до -1
  89.         char* word = (char*)malloc(sizeof(char));
  90.         int i = 0;
  91.         while (sym != '\0' && sym != '\n' && sym != ' ') {
  92.             word = (char*)realloc(word, (i + 1) * sizeof(char));
  93.             word[i] = sym;
  94.             scanf("%c", &sym);
  95.             i++;
  96.         }
  97.         word[i] = '\0';
  98.         add(L1, word);
  99.         scanf("%c", &sym);
  100.     }
  101.  
  102.     printf("L2: ");
  103.     scanf("%c", &sym);
  104.     while (sym != '\0' && sym != '\n') {    //считываем второй список до -1
  105.         char* word = (char*)malloc(sizeof(char));
  106.         int i = 0;
  107.         while (sym != '\0' && sym != '\n' && sym != ' ') {
  108.             word = (char*)realloc(word, (i + 1) * sizeof(char));
  109.             word[i] = sym;
  110.             scanf("%c", &sym);
  111.             i++;
  112.         }
  113.         word[i] = '\0';
  114.         add(L2, word);
  115.         scanf("%c", &sym);
  116.     }
  117.  
  118.     printf("E: "); 
  119.     int i = 0;
  120.     scanf("%c", &sym);
  121.     while (sym != '\0' && sym != '\n' && sym != ' ') {  //считываем Е
  122.         E = (char*)realloc(E, (i + 1) * sizeof(char));
  123.         E[i] = sym;
  124.         scanf("%c", &sym);
  125.         i++;
  126.     }
  127.     E[i] = '\0';
  128.     insert(L1, L2, E);  //делаем магию
  129.     print_list(L1);     //выводим это дело
  130.     printf("length: %d", L1->length);   //и выводим длину этого дела
  131.  
  132.     scanf("%d", &E);
  133. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement