Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [решено] Random element deleting

Ответить
Настройки темы
C/C++ - [решено] Random element deleting

Новый участник


Сообщения: 2
Благодарности: 0

Профиль | Отправить PM | Цитировать


Изменения
Автор: Drongo
Дата: 17-05-2009
Помогите пожалуйста сделать случайное удаление из списка. Вот изначальный код:
Код: Выделить весь код
#include <iostream.h>

struct node
{ 
   char name[20]; // Name of up to 20 letters
   node *nxt;// Pointer to next node
};

   node *start_ptr = NULL;
   node *current; // Used to move along the list
   int option = 0;

void add_node_at_end()
{
   node *temp, *temp2; // Temporary pointers

   // Reserve space for new node and fill it with data
   temp = new node;
   cout << "Please enter the name of the channel: ";
   cin >> temp->name;
   temp->nxt = NULL;

   // Set up link to this node
   if (start_ptr == NULL){
      start_ptr = temp;
      current = start_ptr;
   }
   else{
      temp2 = start_ptr;
      // We know this is not NULL - list not empty!
      while (temp2->nxt != NULL){
           temp2 = temp2->nxt;
           // Move to next link in chain
        }
      temp2->nxt = temp;
   }
}

void display_list()
{
   node *temp;
   temp = start_ptr;
   cout << endl;
   if (temp == NULL)
      cout << "The list is empty!" << endl;
   else{
      while (temp != NULL){
         // Display details for what temp points to
        cout << "Name : " << temp->name << " ";
        /* cout << "Age : " << temp->age << " ";
        cout << "Height : " << temp->height; */
        if (temp == current)
            cout << " <-- Current node";
        
        cout << endl;
        temp = temp->nxt;
    }
   cout << "End of list!" << endl;
 }
}

void delete_end_node()
{ 
   node *temp1, *temp2;
   if (start_ptr == NULL)
      cout << "The list is empty!" << endl;
   else{
      temp1 = start_ptr;
      if (temp1->nxt == NULL){
         delete temp1;
         start_ptr = NULL;
      }
      else{
         while (temp1->nxt != NULL){
             temp2 = temp1;
             temp1 = temp1->nxt;
          }
      delete temp1;
      temp2->nxt = NULL;
    }
  }
}

void main()
{
   start_ptr = NULL;
   do{
      display_list();
      cout << endl;
      cout << "Please select an option : " << endl;
      cout << "0. Exit the program." << endl;
      cout << "1. Add a TV channel to the end of the list." << endl;

      cout << "2. Delete the last TV channel from the list." << endl;
      cout << endl << " >> ";
      cin >> option;

      switch (option){
          case 1 : add_node_at_end(); break;

          case 3 : delete_end_node(); break;
       }
   }
   while (option != 0);
}

Отправлено: 01:21, 17-05-2009

 
pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


на односвязном списке удалить случайный элемент N можно только так:
1. пройти по N указателям "next", найти и запомнить указатель N-1
2. присвоить элементу N-1 значение next = указатель на N+1
3. освободить память от N

Проще по-моему держать массив указателей на названия каналов char* channels[100]

А чтобы так не мучиться, если позволяет память, лучше использовать уже готовые конструкции list<string>

Отправлено: 07:17, 18-05-2009 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 2
Благодарности: 0

Профиль | Отправить PM | Цитировать


спасибо, я уже разобрался, надо было ещё добавить такую функцию:
Код: Выделить весь код
void delete_random_node()
{
	if (!count) return;

	if(count==1){
		delete start_ptr;
		start_ptr=NULL;
		count--;
		return;
	}

	node *temp1, *prev;
	int node=rand()%count;
	int i=0;

	cout << "Deleting " << node << " node."<<endl;
	if(node==0){
		temp1=start_ptr;
		start_ptr=temp1->nxt;
		delete temp1;
		count--;
		return;
	}
	else
	{
		temp1=start_ptr;
		while(1)
		{
			if(i++==node)
			{
				if(temp1->nxt!=NULL)
					prev->nxt=temp1->nxt;
				if(node+1==count){
					prev->nxt=NULL;
				}
				delete temp1;
				count--;
				return;
			}
			prev = temp1;
			temp1=temp1->nxt;
		}
	}
}

Отправлено: 19:35, 19-05-2009 | #3



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [решено] Random element deleting

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Delphi - прога с использованьем "Random" ShadowMas Программирование и базы данных 2 21-11-2008 21:19
C/C++ - Random в C (Си) ganselo Программирование и базы данных 12 21-11-2008 10:16
[решено] RSS. missing root element Artem-Samsung Вебмастеру 4 16-10-2008 01:02
[решено] помогите запустить старенькую игру "Five Element" на XP rizz Игры 2 31-10-2007 16:34
Видно только половину кнопки Пуск при использовании стиля Luna Element mefin Microsoft Windows 2000/XP 2 27-10-2006 21:37




 
Переход