Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 20.11.2016
Сообщений: 15
1

Удалить элементы с одинаковыми соседями из двунаправленного циклического списка

21.02.2017, 16:06. Показов 765. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
удалить элементы с одинаковыми соседями. 1 и последний считать соседями.
Здравствуйте, написала процедуру, но работает не на всех тестах. Когда "abab." зацикливается.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void deleteChars(smb* ch)
{
    smb* head = ch;
    smb* p = NULL;
    while (ch != head->prev)
    {
        if (ch->prev->data == ch->next->data)
        {
            p = ch->next;
            ch->prev->next = ch->next;
            ch->next->prev = ch->prev;
 
            delete ch;
 
            ch = p;
        }
        
        ch = ch->next;
    }
    ch = head;
}
Это структура для двунаправленного циклического списка:
C
1
2
3
4
5
6
struct smb
{
    char data;
    smb* next;
    smb* prev;
};
Добавлено через 1 час 7 минут
Вот то, что есть.
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
88
89
90
91
92
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <stdbool.h>
 
struct smb
{
    char data;
    smb* next;
    smb* prev;
};
 
smb* readList(FILE* file)
{
    smb *ch, *head;
    char c;
 
    head = new smb;
    ch = head;
 
    smb* temp = NULL;
    while ((c = fgetc(file)) != '.')
    {
 
        ch->next = new smb;
        ch->next->prev = ch;
 
        temp = ch;
        ch->data = c;
        ch = ch->next;
    }
 
    temp->next = head;
    head->prev = temp;
 
    return head;
}
void deleteChars(smb* ch)
{
    smb* head = ch;
    smb* p = NULL;
    while (ch != head->prev)
    {
        if (ch->prev->data == ch->next->data)
        {
            p = ch->next;
            ch->prev->next = ch->next;
            ch->next->prev = ch->prev;
 
            delete ch;
 
            ch = p;
        }
 
        ch = ch->next;
    }
    ch = head;
}
void writeList(FILE* file, smb* ch)
{
    smb* head = ch;
 
    while (ch->next != head)
    {
        fprintf(file, "%c", ch->data);
        ch = ch->next;
    }
}
void main()
{
    FILE *read, *write;
    smb* qList;
 
    char file_name[] = "input.txt";
    if ((read = fopen(file_name, "r")) == NULL)
    {
        printf("\nError. Can't open file %s.", file_name);
    }
    qList = readList(read);
    fclose(read);
 
    printList(qList);
 
    if ((write = fopen("output.txt", "w")) == NULL)
    {
        printf("\nError. Can't open file %s.", "C:/output.txt");
    }
    deleteChars(qList);
    writeList(write, qList);
    fclose(write);
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.02.2017, 16:06
Ответы с готовыми решениями:

Удалить все элементы двунаправленного списка равные 10
Создать двунаправленный список, ввести элементы. Из введенных элементов удалить все, равные 10....

Двумерный список, строки представлены в виде двунаправленного циклического списка
Доброго времени суток! :3 Задали написать программу реализующую обработку двумерного списка,...

Удалить из списка элементы с одинаковыми по длине фамилиями
Удалить из списка элементы с одинаковыми по длине фамилиями. PascalABC.NET

Как удалить заданный элемент из двунаправленного списка?
Доброго времени суток! У меня вопрос - как удалить заданный в свойствах метода элемент из...

4
737 / 542 / 416
Регистрация: 17.09.2015
Сообщений: 1,601
21.02.2017, 18:04 2
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int main()
{
    char str[] = "ababaabccaccbaacbbcb";
    int i, j, k = 0, len, *ptr;
    len = strlen(str);
    ptr = malloc(len * sizeof*ptr);
    if(!ptr){
        fprintf(stderr, "Error memory allocate!");
        exit(1);
    }
    if(str[len - 1] == str[1])
        ptr[k++] = 0;
    for(i = 0, j = 2; str[j]; i++, j++){
        if(str[i] == str[j])
            ptr[k++] = i + 1;
    }
    for(i = len - 1, --k; i >= 0; i--){
        if(ptr[k] == i){
            for(j = i; str[j]; j++)
                str[j] = str[j + 1];
            k--;
        }
    }
    for(i = 0; str[i]; i++)
        putchar(str[i]);
    free(ptr);
    return 0;
}
0
0 / 0 / 0
Регистрация: 20.11.2016
Сообщений: 15
21.02.2017, 18:08  [ТС] 3
Но у вас же здесь работа со строками, а не со списком.
0
737 / 542 / 416
Регистрация: 17.09.2015
Сообщений: 1,601
21.02.2017, 18:12 4
для последнего элемента проверочку забыл
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int main()
{
    char str[] = "abab";
    int i, j, k = 0, len, *ptr;
    len = strlen(str);
    ptr = malloc(len * sizeof*ptr);
    if(!ptr){
        fprintf(stderr, "Error memory allocate!");
        exit(1);
    }
    if(str[len - 1] == str[1])
        ptr[k++] = 0;
    for(i = 0, j = 2; str[j]; i++, j++){
        if(str[i] == str[j])
            ptr[k++] = i + 1;
    }
    if(str[len - 2] == str[0])
        ptr[k++] = len - 1;
    for(i = len - 1, --k; i >= 0; i--){
        if(ptr[k] == i){
            for(j = i; str[j]; j++)
                str[j] = str[j + 1];
            k--;
        }
    }
    for(i = 0; str[i]; i++)
        putchar(str[i]);
    free(ptr);
    return 0;
}
Добавлено через 1 минуту
Цитата Сообщение от aartt Посмотреть сообщение
Но у вас же здесь работа со строками, а не со списком.
в задании про это ни слова
0
0 / 0 / 0
Регистрация: 20.11.2016
Сообщений: 15
21.02.2017, 18:17  [ТС] 5
Моя работа основана на списках.
Я же и свой код привела. Написала, что двунаправленный циклический список.
0
21.02.2017, 18:17
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.02.2017, 18:17
Помогаю со студенческими работами здесь

Удалить две первые буквы из сформированного двунаправленного списка
Добрый времени суток! Пожалуйста, помогите: удалить две первые буквы из сформированного...

Найти максимальный элемент двунаправленного списка и удалить его
Создать двунаправленный список, добавить элементы вывести на экран. Найти максимальный элемент и...

Поменять местами элементы двунаправленного списка
Даны ссылки AX и AY на два различных элемента двусвязного списка (элемент AX находится в списке...

Двунаправленный список. Удаление элементов с одинаковыми соседями
Собственно вот такое задание нужно выполнить. Нашел код, который вроде бы работает, но не во всех...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru