|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [решено] Random element deleting |
|
C/C++ - [решено] Random element deleting
|
Новый участник Сообщения: 2 |
Профиль | Отправить PM | Цитировать
Помогите пожалуйста сделать случайное удаление из списка. Вот изначальный код:
#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 |
Ветеран Сообщения: 1180
|
Профиль | Отправить 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
|
Профиль | Отправить 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 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
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 |
|