Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 22.11.2009
Сообщений: 33

Удалить все символы, у которых равные соседи

03.03.2010, 19:05. Показов 2179. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Нужна помощь.
Есть задача: дана последовательность символов оканчивающаяся точкой удалить все символы, у которых равные соседи (первый и последний считать соседями). Последовательность представлена в виде двунаправленного циклического списка.

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
87
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
 
#define INPUT_FILENAME "input.txt"
#define OUTPUT_FILENAME "output.txt"
 
struct characters {
    char data;
    characters* next;
    characters* prev;
};
 
characters* readList (FILE* file);
void deleteChars(characters* ch);
void writeList(FILE* file, characters* ch);
 
int main()
{
    FILE *read, *write;
    characters* qList;
 
    if ((read = fopen(INPUT_FILENAME, "r")) == NULL) {
        printf("\nError. Can't open file %s.", INPUT_FILENAME);
    }
    qList = readList(read);
    fclose(read);
 
    if ((write = fopen(OUTPUT_FILENAME, "w")) == NULL) {
        printf("\nError. Can't open file %s.",OUTPUT_FILENAME);
    }
    deleteChars(qList);
    writeList(write, qList);
    fclose(write);
 
    _getch();
    return 0;
}
 
characters* readList (FILE* file)
{
    characters *ch, *head;
    char c;
 
    head = new characters;
    ch = head;
 
    while ((c = fgetc(file)) != '.')
    {
        ch->next = new characters;
        ch->next->prev = ch;
        ch->data = c;
        ch = ch->next;
    }
 
    ch->next=head;
    head->prev = ch;
 
    return head;
}
 
void deleteChars(characters* ch)
{
    characters* head = ch;
 
    while (ch != head)
    {
        if (ch->prev->data == ch->next->data) {
            ch->next->prev = ch->prev;
            ch->prev->next = ch->next;
            delete ch;
        }
        ch = ch->next;
    }
    ch = head;
}
 
void writeList(FILE* file, characters* ch)
{
    characters* head = ch;
 
    while (ch->next != head)
    {
        fprintf(file, "%c", ch->data);
        ch = ch->next;
    }
}
Программа работает некорректно, а конкретно не удаляет символы. Где может быть ошибка?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.03.2010, 19:05
Ответы с готовыми решениями:

Удалить все символы, у которых равные соседи
Начинаю работать в С, не всегда работает /*Дана последовательность символов, оканчивающаяся точкой. Удалить все символы, у которых...

Двунаправленные списки: удалить все элементы, у которых соседи одинаковы
Из списка, который состоит не менее чем из двух элементов, удалить все элементы, у которых одинаковы соседние элементы.

Кольцевой двунаправленный список: удалить все элементы, у которых одинаковые соседи
Дан кольцевой двунаправленный список. Из списка L удалить все элементы у которых одинаковые соседи (первый и последний элемент считать...

9
Псевдо программист
 Аватар для R0mm
192 / 113 / 37
Регистрация: 19.09.2009
Сообщений: 303
03.03.2010, 19:07
Цитата Сообщение от noob123 Посмотреть сообщение
characters* head = ch;
while (ch != head)
видимо тут
1
0 / 0 / 0
Регистрация: 22.11.2009
Сообщений: 33
03.03.2010, 19:10  [ТС]
R0mm, можете пояснить поконкретнее?)
0
Псевдо программист
 Аватар для R0mm
192 / 113 / 37
Регистрация: 19.09.2009
Сообщений: 303
03.03.2010, 19:19
переменные head и ch равны в начале подпрограммы.
следовательно проверка ch != head вернет ложь и цикл не будет выполняться.
0
0 / 0 / 0
Регистрация: 22.11.2009
Сообщений: 33
03.03.2010, 19:28  [ТС]
Тогда какое условие для цикла прописать, подскажите.
0
Псевдо программист
 Аватар для R0mm
192 / 113 / 37
Регистрация: 19.09.2009
Сообщений: 303
03.03.2010, 19:34
может заменить конструкцию while() {} на do{}while() ?
1
0 / 0 / 0
Регистрация: 22.11.2009
Сообщений: 33
03.03.2010, 19:42  [ТС]
Заменил. Сейчас ошибка в строчке:

C
1
if (ch->prev->data == ch->next->data)
0
Псевдо программист
 Аватар для R0mm
192 / 113 / 37
Регистрация: 19.09.2009
Сообщений: 303
03.03.2010, 19:51
лог компилятора запостите
0
0 / 0 / 0
Регистрация: 22.11.2009
Сообщений: 33
03.03.2010, 20:20  [ТС]
Вот это:
Unhandled exception at 0x00f81697 in zach.exe: 0xC0000005: Access violation reading location 0xfeeefef6.
Добавлено через 24 минуты
Никто не может помочь? (
0
Псевдо программист
 Аватар для R0mm
192 / 113 / 37
Регистрация: 19.09.2009
Сообщений: 303
03.03.2010, 21:22
с памятью проблемы

Добавлено через 2 минуты
Попробуйте так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void deleteChars(characters* ch)
{
     characters* head = ch;
     characters* ptmp;
     while (ch != head)
      {
           if (ch->prev->data == ch->next->data) {
                ch->next->prev = ch->prev;
                ch->prev->next = ch->next;
                ptmp = ch;
                delete ptmp;
            }
            ch = ch->next;
      }
      ch = head;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.03.2010, 21:22
Помогаю со студенческими работами здесь

Посчитать количество символов, у которых равные соседи в исходной строке
В общем задача состоит в том чтобы посчитать количество символов у которых равные соседи в исходной строке, которая вводится с клавиатуры....

Из файла символов удалить все символы, равные данному
Здравствуйте , задача в чем : &quot;из файла символов удалить все символы равные данному &quot;. есть условия к программе : 1)работа с...

Функция: подсчитать количество элементов кольцевого двунаправленного списка L, у которых равные соседи
Пусть L обозначает двунаправленный список с заглавным звеном. Описать функцию или процедуру, которая подсчитывает количество элементов...

Удалить все элементы, у которых одинаковые "соседи"
Необходимо описать процедуру которая удаляет все элементы, у которых одинаковые &quot;соседи&quot; (первый и последний тоже считать...

Подсчитать количество элементов списка L, у которых равные "соседи"
процедура, которую нужно сделать: подсчитывает количество элементов списка L, у которых равные &quot;соседи&quot; (первый и последний...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru