Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [С++] динамическая память, работа со строками 
:(
    Опции темы
ksa
Дата 29.4.2009, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 5.1.2009

Репутация: нет
Всего: нет



Одно из возможных представлений «длинного» текста  –  это разделить его на участки  (строки)  равной длины и создать массив ссылок на эти строки. Используя данное представление текста описать:
-процедуру,   добавляющую после   i-той строки  копию  j-той  строки.
- процедуру,  печатающую построчно текст.

Первая часть задачи сделана,помогите написать процедуру,   добавляющую после   i-той строки  копию  j-той  строки.
Код

#include <iostream.h>
#include <conio.h>

class Spisok
{
  private:
    struct node
      {
        int elem; 
        node *sled;
      } *phead; //Указатель на начало списка.
  public: 
    Spisok() {phead = new (node); (*phead).sled=NULL;} //Конструктор.
    ~Spisok() { delete phead; } //Деструктор.
    void POSTROENIE (); 
    void VYVOD (); 
    void OCHISTKA ();
}; 

void main ()
{
clrscr();
  Spisok A;

  A.POSTROENIE ();
  A.VYVOD ();
  A.OCHISTKA ();
  getch();


void Spisok::POSTROENIE ()
//Построение однонаправленного списка с заглавным звеном.
//phead - указатель на заглавное звено списка. 
{
  node *t;
  int el;
  t = phead;
  cout<< "Enter elem spiska: "<<endl;
  cin>>el;
  while (el!=0)
  { 
    (*t).sled = new (node); 
    t = (*t).sled; (*t).elem = el; (*t).sled = NULL; 
    cin>>el;
  }


void Spisok::VYVOD ()
//Вывод содержимого однонаправленного линейного списка с заглавным звеном.
//phead - указатель на заглавное звено списка.
{
  node *t;
  t = (*phead).sled; 
  cout<<"Spisok: "<<endl;
  while (t!=NULL)
  { 
    cout<<(*t).elem<<endl; 
    t = (*t).sled;
  }
//  cout<<endl;
}

void Spisok::OCHISTKA ()
//Удаление однонаправленного списка из памяти.
//phead - указатель на заглавное звено списка.
{
  node *q,*q1; //Рабочие указатели.

  q = phead;
  q1 = (*q).sled; //Указатель q1 "опережает" указатель q.
  while (q1!=NULL)
  { q = q1; q1 = (*q1).sled; delete q;}
}



Заранее всем спасибо.
PM MAIL   Вверх
zim22
Дата 30.4.2009, 07:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 16
Всего: 69



Цитата(ksa @  29.4.2009,  22:21 Найти цитируемый пост)
(*t).sled;

t->sled; smile

Это сообщение отредактировал(а) zim22 - 30.4.2009, 07:01


--------------------
PM MAIL   Вверх
Dov
Дата 30.4.2009, 07:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 50
Всего: 88



zim22,  это одно и тоже... smile 


--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
zim22
Дата 30.4.2009, 08:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 16
Всего: 69



Цитата(Dov @  30.4.2009,  07:50 Найти цитируемый пост)
это одно и тоже... 

я знаю smile
я к тому, что оператор стрелка здесь лучше смотрится, чем операция разыменования указателя, а потом доступ к его членам.




--------------------
PM MAIL   Вверх
Dov
Дата 30.4.2009, 08:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 50
Всего: 88



Вообще-то, да.    smile 


--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
zim22
Дата 30.4.2009, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 16
Всего: 69



Цитата(ksa @  29.4.2009,  22:21 Найти цитируемый пост)
-процедуру,   добавляющую после   i-той строки  копию  j-той  строки.

i-я строка с j-й как связаны?


--------------------
PM MAIL   Вверх
ksa
Дата 30.4.2009, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 5.1.2009

Репутация: нет
Всего: нет



Цитата(zim22 @  30.4.2009,  09:01 Найти цитируемый пост)
i-я строка с j-й как связаны?

Никак, номера i-ой и j-ой строки вводятся с клавиатуры.
PM MAIL   Вверх
zim22
Дата 30.4.2009, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 16
Всего: 69



Цитата(ksa @  30.4.2009,  18:56 Найти цитируемый пост)
Никак, номера i-ой и j-ой строки вводятся с клавиатуры.

т.е. алгоритм так должен выглядеть?

Код

std::string str("very very long string");
splice(str, 4, output_array); //после обработки output_array = {"very", " ver", "y lon", "g str", "ing"}
add_to_list(output_array[1], output_array[4]); // list = " vering";





--------------------
PM MAIL   Вверх
ksa
Дата 30.4.2009, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 5.1.2009

Репутация: нет
Всего: нет



Цитата(zim22 @  30.4.2009,  19:31 Найти цитируемый пост)
std::string str("very very long string");splice(str, 4, output_array); //после обработки output_array = {"very", " ver", "y lon", "g str", "ing"}add_to_list(output_array[1], output_array[4]); // list = " vering";


В принципи Ты прав, но мне достаточно сделать так:

Код

// Это уже рабочая часть.
"Enter elem spiska: "
1111
2222
3333
4444
0
"Spisok: "
1111
2222
3333
4444
// А потом сделать перестановку.
1
3
"Spisok: "
1111
2222
3333
1111
4444


Добавлено через 3 минуты и 23 секунды
Точнее так:
Код

// А потом сделать перестановку.
1
3
"Spisok: "
1111
3333
2222
3333
4444

PM MAIL   Вверх
zim22
Дата 30.4.2009, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 16
Всего: 69



Цитата(ksa @  30.4.2009,  19:59 Найти цитируемый пост)
В принципи Ты прав, но мне достаточно сделать так:

я Тебе код написал. Комментариев не жди. Бу-га-га  smile 
Код

// 070.cpp : Defines the entry point for the console application.
//
#include <iostream>

struct Node {
  Node(int v, Node *n = 0) : value(v), next(n) { }
  Node(const Node &rhs) : value(rhs.value), next(rhs.next) { }
  int value;
  Node *next;
};
typedef Node *link;

int main()
{
  const int coefficient = 1111;
  link t = new Node(coefficient);
  link head = t;
  for (int i = 2; i != 5; ++i) {
    t = (t->next = new Node(i * coefficient));
  }

  for (link p = head; p; p = p->next) {
    std::cout << p->value << std::endl;    
  }
  std::cout << std::endl;


  int i_pos = 1, j_pos = 3;
  
  link i_node = head;
  for (int i = 0; i != i_pos - 1; i_node = i_node->next, ++i);  

  link j_node = head;
  for (int i = 0; i != j_pos; j_node = j_node->next, ++i);

  link inserted_node = new Node(*i_node);
  j_node->next = 0;
  inserted_node->next = j_node;

  j_node = head;
  for (int i = 0; i != j_pos - 1; j_node = j_node->next, ++i);
  
  j_node->next = inserted_node;

  for (link p = head; p; p = p->next) {
    std::cout << p->value << std::endl;    
  }

    return 0;
}





--------------------
PM MAIL   Вверх
ksa
Дата 30.4.2009, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 5.1.2009

Репутация: нет
Всего: нет



Цитата(zim22 @  30.4.2009,  20:27 Найти цитируемый пост)
  for (int i = 0; i != i_pos - 1; i_node = i_node->next, ++i);  
  for (int i = 0; i != j_pos; j_node = j_node->next, ++i);
  for (int i = 0; i != j_pos - 1; j_node = j_node->next, ++i);
  for (link p = head; p; p = p->next)

А у меня Borland ругается почему-то на i и p
Говорит - multiple declaration for i...
Что делать?
PM MAIL   Вверх
zim22
Дата 1.5.2009, 06:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 16
Всего: 69



Цитата(ksa @  30.4.2009,  20:59 Найти цитируемый пост)
Что делать?

вынеси объявление i и p за пределы цикла.
Код

int i = 0;
for (i = 0; i != i_pos - 1; i_node = i_node->next, ++i);  
for (i = 0; i != j_pos; j_node = j_node->next, ++i);
for (i = 0; i != j_pos - 1; j_node = j_node->next, ++i);

link p = 0;
for (p = head; p; p = p->next)



--------------------
PM MAIL   Вверх
ksa
Дата 1.5.2009, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 5.1.2009

Репутация: нет
Всего: нет



zim22
А можно сделать так, чтобы вместо "1111 2222 3333 4444" программа работала с любыми строками (введенными с клавиатуры)?
т. е. не зависимо от количества и длины строк?
PM MAIL   Вверх
zim22
Дата 1.5.2009, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 16
Всего: 69



Цитата(ksa @  1.5.2009,  15:51 Найти цитируемый пост)
А можно сделать так, чтобы вместо "1111 2222 3333 4444" программа работала с любыми строками

конечно можно. делайте.


--------------------
PM MAIL   Вверх
ksa
Дата 1.5.2009, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 5.1.2009

Репутация: нет
Всего: нет



И на этом Большое Спасибо smile

Это сообщение отредактировал(а) ksa - 1.5.2009, 20:19
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0866 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.