|
|
Random element deleting
Помогите пожалуйста сделать случайное удаление из списка. Вот изначальный код:
Код:
#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);
}
|
на односвязном списке удалить случайный элемент N можно только так:
1. пройти по N указателям "next", найти и запомнить указатель N-1
2. присвоить элементу N-1 значение next = указатель на N+1
3. освободить память от N
Проще по-моему держать массив указателей на названия каналов char* channels[100]
А чтобы так не мучиться, если позволяет память, лучше использовать уже готовые конструкции list<string>
|
спасибо, я уже разобрался, надо было ещё добавить такую функцию:
Код:
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;
}
}
}
|
Время: 02:33.
© OSzone.net 2001-