1

Описать функцию, которая формирует список М1 - копию списка М и список М2, представляющий собой ”перевернутый” список М. Функция my_copy не работает. Что не так? И еще не знаю, как сделать перевернутый список...

  #include <stdlib.h>
  #include <stdio.h>
  #include <conio.h>
  typedef struct st {   // элемент
int info;   // элемент хранения
    struct st *prev;    // указатель на следующий элемент
    } ELEMENT;
   void add(ELEMENT **head, int item); // поместить item в
    void my_copy(ELEMENT** head);
    void print_list(ELEMENT *head);

     void clear(ELEMENT **head);

       int main(){   ELEMENT *head = NULL; ELEMENT *new_head = NULL;
       int i,value;

      for (i = 0; i< 4; i++){
     printf("Vvedite element %d:", i+1);
     scanf("%d",&value);
    add(&head,value);   }

     puts("Spisok1");
          print_list(head);
          puts("\nSpisok2:");
          while(head){
       print_list(my_copy(head));}
           clear(&head);
            return 0; }

          void add(ELEMENT **head, int item){ // поместить item в список
           ELEMENT * new_item;
            new_item = (ELEMENT *) malloc( sizeof (ELEMENT) );//выделяем память под новый элемент
           new_item -> info = item; // присваиваем значение121345678939 новому элементу
         new_item -> prev = *head; // присоединяем новый элемент на вершину
        *head = new_item; }

     void print_list(ELEMENT *head){
      while (head){
       printf("%d ",head->info);
       head = head->prev;   } }

        void clear(ELEMENT **head){
       ELEMENT *element;
       while (*head){
        element = *head;
       *head = (*head)-> prev;
       free(element);   } }

    ELEMENT* my_copy(ELEMENT **head){

    ELEMENT *i_ptr = *head;
    ELEMENT *new_new_item;

    new_new_item = (ELEMENT *) malloc( sizeof (i_ptr->info,i_ptr->prev) );

    ELEMENT *new_head = new_new_item;

    while( i_ptr->prev != NULL ){

        new_new_item->prev = (ELEMENT *) malloc( sizeof (i_ptr->prev->info,i_ptr->prev->prev) );

        i_ptr = i_ptr->prev;
       new_new_item = new_new_item->prev;
    }
    return new_head;
}
1
  • Имея операцию, которая переворачивает связный список, например, такую как @avp показал, можно легко определить операцию копирования рекурсивно: List List_copy(List head, List copy) { return head ? List_copy(head->next, List_push_front(copy, head->cargo)) : List_reverse_inplace(copy); } где List_push_front() добавляет новый элемент в начало списка. Пример: List M1 = List_copy(M, NULL); List M2 = List_reverse_inplace(M); Некоторые компиляторы умеют оптимизировать рекурсивный вызов в хвостовой позиции.
    – jfs
    27 ноя 2014 в 8:24

1 ответ 1

1

@Equin, реверс односвязного списка обычно пушут так:

ELEMENT *
reverse_list (ELEMENT *list)
{
  ELEMENT *p, *head = 0;

  while (list) {
    p = list;
    list = list->next;
    p->next = head;
    head = p;
  }

  return head;
}

--

А что именно не работает (какие симптомы Вы наблюдаете) в my_copy()?

1
  • @avp, prntscr.com/5abb32 вот это и есть симптом что 'my_copy' не работает...
    – Equin
    26 ноя 2014 в 13:37

Ваш ответ

By clicking “Отправить ответ”, you agree to our terms of service and acknowledge you have read our privacy policy.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками или задайте свой вопрос.