Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [решено] Random element deleting (http://forum.oszone.net/showthread.php?t=140349)

HD295 17-05-2009 01:21 1120428

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);
}


pva 18-05-2009 07:17 1121114

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

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

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

HD295 19-05-2009 19:35 1122620

спасибо, я уже разобрался, надо было ещё добавить такую функцию:
Код:

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.

Время: 02:33.
© OSzone.net 2001-