Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
Другие темы раздела
C (СИ) Открытие файла в директории с программой http://www.cyberforum.ru/c-beginners/thread975930.html
По идее эта программа как я понял должна работать ,но она выводит Error .Народ подскажите как открыть файл лежащий не в папке ,в которой работает си. #include <stdio.h> #include <string.h>...
C (СИ) Как преобразовать выражение? Компиляю Ubuntu touch под i9505... Почему в этом коде при компиляции вылетает ошибка? hardware/samsung/libalsa-intf/alsa_pcm.c:911:9: error: return makes pointer from integer without a cast как... http://www.cyberforum.ru/c-beginners/thread975906.html
C (СИ) как создать таблицу на языке С?
как сделать таблицу в исходнике, чтобы она выводилась на экран? вот код. нужно, чтобы в одной колонке был Х , а в другой У. #include <stdio.h> #include <windows.h> #include <locale.h> #include...
Вывод масива C (СИ)
Добрый вечер! Помогите, пожалуйста! Делаю программку, которая обрабатывает массив. Массив заполняется через функцию random. Если сразу ставить, чтобы генерировал и выводил массив на экран - то...
C (СИ) четные числа меньше 24, и их квадраты на экран http://www.cyberforum.ru/c-beginners/thread975846.html
Написать программу, которая выводит четные числа меньше 24, и их квадраты на экран.
C (СИ) Структурированная программа Помогите написать программу, которая проверяет, можно ли представить число x в виде 3^y*(3*z+1) для некоторых y и z. подробнее
jinatar
2 / 2 / 0
Регистрация: 07.10.2013
Сообщений: 14
0

Ошибка в коде из методички. Работа с двусвязным списком

13.10.2013, 10:01. Просмотров 469. Ответов 5
Метки (Все метки)

Код из электронной методички не собирается с ошибкой |39|error: dereferencing pointer to incomplete type|
Что тут может быть не правильно ума не приложу, ибо с этой темой планировал разобраться как раз с помощью примера, а тут вот как.
Этот пример нужен мне, что бы начать нормально кодить свой курсовой (использовать пример с ошибкой как то не православно).

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
typedef struct
{char data[20];
  struct spis *v1; // v1 – указатель на предыдущую структуру
  struct spis *v2; // v2 – указатель на последующую структуру
} spis;
void create(void); // создание
void list(spis *); // просмотр
void del(void); // удаление
struct spis *head,*tail; // указатели на начало и конец списка
main()
{
  clrscr();
  create();
  list(head); // просмотр с начала списка
  list(tail); // просмотр с конца списка
del();
list(head);
free(head);
}
void create(void)
{spis *p,*pred;
  pred=NULL;
  do { p=(spis *)malloc(sizeof(spis));
    printf("Фамилия: "); gets(p->data);
    p->v1=pred;
    if (pred != NULL)
      pred->v2=p;
    else
      head=p;
    pred=p;
    puts(" Закончить - <esc>");
}
while (getch()!=27);
  tail=p;
  tail->v2=NULL;
}
void list(spis *p)
{if (p==head)
  while (p != NULL)
    {puts(p->data);
      p=p->v2;
    }
   else if (p==tail)
  while ( p!= NULL)
  {puts(p->data);
    p=p->v1;
  }
  else
    puts("Неверный адрес ");
    getch();
  }
void del(void)
{spis *p,*temp;char f[20]; // f[20] – Строка для удаляемой фамилии
  clrscr();
  printf("Фамилия: ");gets(f);
  p=head;
  while (p!=NULL)
    {if (strcmp((p->data),f)==0) // если найдена заданная фамилия
    {if (p==head) // если найденная запись - первая
        {head=p->v2;
          head->v1=NULL;
          free(p);
          p=head;
        }
       else if (p==tail) // если найденная запись - последняя
      {tail=p->v1;
        tail->v2=NULL;
        free(p);
        p=tail;
      }
      else // удаление из средины списка
      {p->v2->v1=p->v1;
        p->v1->v2=p->v2;
        temp=p;
        p=p->v2;
        free(temp);
      }
    }
else // если заданная фамилия не найдена – продвигаемся по списку
p=p->v2;
}
}
P.S.
Изначально код был такой, но так как в CodeBlocks нету библиотеки alloc.h, код был переделан с другим объявлением структуры(подозреваю что ошибка как то связана с этим).
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include <stdio.h>
#include <conio.h>
#include <alloc.h>
#include <string.h>
struct spis
{char data[20];
  struct spis *v1; // v1 – указатель на предыдущую структуру
  struct spis *v2; // v2 – указатель на последующую структуру
};
void create(void); // создание
void list(spis *); // просмотр
void del(void); // удаление
struct spis *head,*tail; // указатели на начало и конец списка
main()
{
  clrscr();
  create();
  list(head); // просмотр с начала списка
  list(tail); // просмотр с конца списка
del();
list(head);
free(head);
}
void create(void)
{spis *p,*pred;
  pred=NULL;
  do { p=(spis *)malloc(sizeof(spis));
    printf("Фамилия: "); gets(p->data);
    p->v1=pred;
    if (pred != NULL)
      pred->v2=p;
    else
      head=p;
    pred=p;
    puts(" Закончить - <esc>");
}
while (getch()!=27);
  tail=p;
  tail->v2=NULL;
}
void list(spis *p)
{if (p==head)
  while (p != NULL)
    {puts(p->data);
      p=p->v2;
    }
   else if (p==tail)
  while ( p!= NULL)
  {puts(p->data);
    p=p->v1;
  }
  else
    puts("Неверный адрес ");
    getch();
  }
void del(void)
{spis *p,*temp;char f[20]; // f[20] – Строка для удаляемой фамилии
  clrscr();
  printf("Фамилия: ");gets(f);
  p=head;
  while (p!=NULL)
    {if (strcmp((p->data),f)==0) // если найдена заданная фамилия
    {if (p==head) // если найденная запись - первая
        {head=p->v2;
          head->v1=NULL;
          free(p);
          p=head;
        }
       else if (p==tail) // если найденная запись - последняя
      {tail=p->v1;
        tail->v2=NULL;
        free(p);
        p=tail;
      }
      else // удаление из средины списка
      {p->v2->v1=p->v1;
        p->v1->v2=p->v2;
        temp=p;
        p=p->v2;
        free(temp);
      }
    }
else // если заданная фамилия не найдена – продвигаемся по списку
p=p->v2;
}
}


Вернуться к обсуждению:
Ошибка в коде из методички. Работа с двусвязным списком
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.10.2013, 10:01
Готовые ответы и решения:

Работа с двусвязным списком - создание, просмотр, добавление и редактирование записей
Доброе время суток! Практически моя вторая программа на Си, которую пытаюсь сделать сама. Взяла...

Задача с двусвязным списком. Правильно ли решена?
#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;malloc.h&gt; typedef struct node { int data;...

Объясните пожалуйста действия с двусвязным списком типа кольцо
объявляем struct RING { char surname; RING *l, *r; };

Работа с двусвязным нециклическим списком: инверсия списка
Есть программа для работы с двухсвязным списком. Есть проблемы с функцией инверсии списка. Visual...

Работа с двусвязным списком. Проблема с функцией удаления с конца
Есть задача на двусвязный список, но наблюдается непонятная ошибка. Если сделать функцию удаления...

5
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru