Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.05.2015, 21:03   #1
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию C++, удалить элементы списка, начинающихся с "К"

Привет всем, ребят, есть однонаправленный список строк, из него надо удалить элементы, начинающиеся с символов К, к, k и K.

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

Код:
void MainWindow::on_pushButton_3_clicked() //удалить
{

    items  *outitems;



    while (curritem)
    {
        QString symbol=curritem->spisok_slov;

      if ((symbol[0]!='k') && (symbol[0]!='K') && (symbol[0]!='к') && (symbol[0]!='К'))
        {

            outitems=new items;
            outitems ->spisok_slov=curritem->spisok_slov; //в голову добавляем строку
            if(!(head))
                outitems->next=NULL;
            else
                outitems->next=head;
            head=outitems;


    }}

    ui->textEdit->clear();//очистка
    while (outitems)
    {

        ui->textEdit->append(QString("%1").arg(outitems->spisok_slov));//добавление на новую строку
        outitems=outitems->next;
    }


}

А вот полный код
Код:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QString>


struct items
{
    QString spisok_slov;
    items *next;
};

items *head=NULL;

items *curritem;

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete curritem;
    delete ui;
}



void MainWindow::on_pushButton_clicked() //формирование списка+заполнение
{

    curritem = new items; //новый список
    curritem ->spisok_slov=ui->lineEdit->text(); //в голову добавляем строку
    if(!(head))
        curritem->next=NULL;
    else
        curritem->next=head;
    head=curritem;


    ui->lineEdit->clear(); //чистим эдит
    ui->lineEdit->setFocus();//фокус в эдит

    ui->textEdit->clear();//очистка
    while (curritem)
    {

        ui->textEdit->append(QString("%1").arg(curritem->spisok_slov));//добавление на новую строку
        curritem=curritem->next;
    }

}

void MainWindow::on_pushButton_2_clicked() //вставить пробелы
{
    curritem = head;
    QString golov =curritem->spisok_slov;

    ui->textEdit->clear();//очистка

    while (curritem)
    {

        if(golov==curritem->spisok_slov)
            // если элемент равен голове, то +10 пробелов и вывод



            ui->textEdit->insertPlainText(QString::fromLocal8Bit("%1          ").arg(curritem->spisok_slov));
        else
            ui->textEdit->insertPlainText(QString::fromLocal8Bit("%1").arg(curritem->spisok_slov));
        curritem=curritem->next;
    }

}

void MainWindow::on_pushButton_3_clicked() //удалить
{

    items  *outitems;



    while (curritem)
    {
        QString symbol=curritem->spisok_slov;

      if ((symbol[0]!='k') && (symbol[0]!='K') && (symbol[0]!='к') && (symbol[0]!='К'))
        {

            outitems=new items;
            outitems ->spisok_slov=curritem->spisok_slov; //в голову добавляем строку
            if(!(head))
                outitems->next=NULL;
            else
                outitems->next=head;
            head=outitems;


    }}

    ui->textEdit->clear();//очистка
    while (outitems)
    {

        ui->textEdit->append(QString("%1").arg(outitems->spisok_slov));//добавление на новую строку
        outitems=outitems->next;
    }


}
Вот задание
Изображения
Тип файла: jpg задание.jpg (37.2 Кб, 52 просмотров)
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 10.05.2015, 21:50   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Можно полюбопытствовать, почему не используется вот это?: http://doc.crossplatform.ru/qt/4.7.x/qlist.html
Цитата:
то записать всю строку в новый список
А просто сделать пересцепку предидущего элемента с последующим не хочешь?
Или задание такое что нельзя?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.05.2015, 22:02   #3
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

А как сделать сцепку? qlist нельзя использовать

Почему-то первые две кнопки работают нормально, а вот третья зацикливается при заполнении второго созданного списка (outitems). В чем может быть проблема?
from dark to light)

Последний раз редактировалось Stilet; 11.05.2015 в 06:39.
Алексей_2012 вне форума Ответить с цитированием
Старый 11.05.2015, 06:46   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
А как сделать сцепку?
Да оч. просто:
Код:
items *i=0, *prev=0;
i=head;
while(i){
 if(i->spisok_slov[0]=='k'){
  if(prev) { //Если не начало списка
   prev->next=i->next; //Пересцепка
   delete i;
   i=prev->next;
  } else { //Если начало списка
   prev=i;
   i=i->next;
   delete prev;
  }
 } else {
  prev=i->next
  i=i->next;
 }
}
Писал по памяти, не думаю что много ошибок, но возможно.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.05.2015, 08:35   #5
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

извините, но смысл мне не очень понятен. Объясните подробнее, пожалуйста.
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 11.05.2015, 08:56   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Попробую. Смысл в следующем. Делается проход по списку. Если определенное условие на текущем элементе сработало то проверяем, не первый ли это элемент в списке. Если первый то удаляем его, а первым делаем следующий за ним (второй). Если не первый то у предидущего элемента выставляем указатель на следующий за удаляемым элемент, а текущий удаляем. Таким образом предидущий элемент цепляется за следующий, а текущий выпадает.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.05.2015, 09:44   #7
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

доходчиво объяснили, спасибо.

Тогда еще вопрос, а что если список состоит из строк, например:

0. Коля Никола
1. Валентина Капралова

Как удалить слова? Чтоб получилось

Никола
Валентина

Это на каждой итерации цикла записывать голову в строку и делать еще один цикл по переборке строки?

Как Ваш код поправить?
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 11.05.2015, 10:24   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
Это на каждой итерации цикла записывать голову в строку и делать еще один цикл по переборке строки?
Ну да. Тут пожалуй придется описывать отдельно функцию, которая будет принимать строку, вырезать из нее слова и возвращать уже без этих слов. А мой пример для такой задачи не подходит. Поскольку редактирование содержимого элемента списка не требует пересцепки. Другое дело что если функция вернет пустую строку - программа должна по идее изьять элемент из списка пересцепкой.
В любом случае вместо i->spisok_slov[0]=='k' нужно булевую функцию, которая будет заниматься чисткой элемента и возвращать результат, говорящий о том, удалять или нет.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.05.2015, 19:56   #9
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

А как это будет выглядеть?
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 11.05.2015, 20:10   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

А ты сам попробуй написать разбиение строки на массив слов, а потом сборку строки из этого массива, исключая некоторые слова.
Вот могу примерчик подкинуть: http://www.programmersforum.ru/showthread.php?t=199931
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Постоянно слетает галочка "автоматически" в "Параметры Excel", "Формулы", "Вычисления в книге" Alexsandrr Microsoft Office Excel 4 19.10.2013 14:22
Типизированные файлы - Дан файл целых чисел, найти "Сумму чисел, начинающихся с цифры 1" (Паскаль) 777pro777 Помощь студентам 1 27.03.2012 08:42
удалить папки из раздела "мой компьютер" - "сеть" Aлeкceй Безопасность, Шифрование 2 05.12.2011 18:10
VBA_макрос: удалить всю строку в таблице, если в ней есть слово "удалить" макарошка Microsoft Office Excel 15 05.10.2010 09:09
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04