Usuwanie elementu listy w tablicy jednowymiarowej

0

Witam.
Mam takie zadanie.

Napisz program (z wykorzystaniem wskaźników), który stworzy dynamiczną listę do której doda wybraną ilość elementów, które zostaną wprowadzone przez użytkownika, następnie użytkownik zostanie poproszony o wybranie elementu listy, który ma zostać usunięty. Po wykonaniu operacji usunięcia elementu program wyświetli aktualnie przechowywane dane.

Kod mam taki:

//#include "stdafx.h"
#include <iostream>
#include <cstdlib>
#include <iomanip>

using namespace std;



int rozmiar_tab(int *roz_t) //funkcja deklaryjąca rozmiar tablicy;
{
	//int roz_t;
	cout << "Podaj rozmiar tablicy: " << endl;
    cin >> *roz_t;
return *roz_t;
}

void uzupelnij_tab(int *uzupelnianie_t, int *k) //funkcja zapełniająca tablice;
{
	for (int i = 0; i<*k; i++)
	{
		cout << "Podaj " << i + 1 << " element tablicy: ";
		cin >> uzupelnianie_t[i];
	}
//return *uzupelnianie_t[i];
}

void wypisz_tab(int *wypisz_t, int *k) //funkcja wypisująca tablice;
{
	for (int w = 0; w<*k; w++)
	{
		cout << w + 1 << " Aktualne Elementy tablicy: " << wypisz_t[w] << endl;
	}
//return *wypisz_t[i];
}

int main()
{
	int t, del;
	int *tab;

	rozmiar_tab (&t); //wywołanie funkcji rozmiar_tab;
	tab = new int[t];
	
	uzupelnij_tab (tab, &t); //wywołanie funkcji uzupelnij_tab;
	wypisz_tab (tab, &t); //wywołanie funkcji wypisz_tab;
	
	
	getchar();
	getchar();
	delete[] tab;
    return 0;
}
 

Problem polega na tym.. że nie wiem jak usunąć ten element...
Ktoś mi podpowiedział by przepisać chciane elementy do innej tablicy.. ale raz że nie wiem jak dwa to chyba nie do końca zgodne z treścią zadania...

Wykład ze wskaźnikami będę miał dopiero za 2 tyg i staram się samemu jakoś to ogarnąć ale chyba nie daje rady do końca..

0

jak usuwasz cokolwiek z tablicy to masz dwie opcje

  1. zignorowac element (czyli potrzebujesz tam std::map zeby sprawdzac). Pozniej po jakims czasie przepisac to do innej tablicy (tylko elementy ktore nie zostaly zignorowane/usuniete)
  2. przepisac tablice do innej tablicy bez tego elementu ktory usuwasz

Poprawna metoda do tego zadania jest sposob 2.

Jezeli wiesz jak wypisac tablice, to juz masz praktycznie gotowe przepisanie tablicy. Potrzebujesz jedynie stworzyc tablice o odpowiednim rozmiarze

0

dodałem taką funkcje

 
int del_el_tab(int *roz_t2, int *del) //funkcja usuwająca element tab;
{
	int *tab2;
	*del = *roz_t2;
	*del -= 1;
	
	tab2 = new int[*del];
	
	for (int w = 0; w<*del; w++)
	{
		cout << w + 1 << " Aktualne Elementy tablicy: " << tab2[w] << endl;
	}
	
return *roz_t2;
}

wywołanie:

 del_el_tab (&t, &del);

jednak efekt jest taki:
http://scr.hu/41nd/cilbh

czyli coś źle robię.. da radę to jakoś bardziej łopatologicznie wyjaśnić (bez gotowca oczywiście)

1

nazywaj zmienne normalnie, ja nie powinienem sie domyslac co to robi tylko wiedziec po przeczytaniu zmiennej.

Ty to co tutaj robisz to jest po prostu... nawet nie wiem jak to nazwac... to nie ma sensu. Dodatkowo masz memory leak i pewnie tone UB

tutaj wersja ktora pisza poczatkujacy

int* deleteItem(int array[], int size, int element)
{
  int* newArray = new int[size-1];
  int indexNew = 0;
  for (int index = 0; index < size; index++)
  {
    if(array[index] != element)
    {
      newArray[indexNew] = array[index];
      indexNew++;
    }
  }
  return newArray;
}

jezeli array[] jest obiektem dynamicznym to nie zapomniec uzyc na nim delete[]! tak samo na tym co tutaj stworzysz

tutaj jak to sie powinno robic (czyli korzystac z gotowych narzedzi)

auto arrayEnd = std::remove(std::begin(array), std::end(array), 3); // 3 to wartosc ktora zostanie usunieta 

a tutaj jak to sie robi

std::vector<int> array;
// tutaj sobie wypelniasz stwoja tablice

// usuwasz obiekt o indeksie 2. Mozesz indeks znalezc za pomoca std::find
array.erase(array.begin() + 2); 
0
fasadin napisał(a):
int* deleteItem(int array[], int size, int element)

Dlaczego int* deleteItem.. ? w sensie dlaczego *.. bo nie miałem tego jeszcze :)

fasadin napisał(a):
auto arrayEnd = std::remove(std::begin(array), std::end(array), 3); // 3 to wartosc ktora zostanie usunieta 

nie znam jeszcze tych funkcji..

fasadin napisał(a):
std::vector<int> array;
// tutaj sobie wypelniasz stwoja tablice

// usuwasz obiekt o indeksie 2. Mozesz indeks znalezc za pomoca std::find
array.erase(array.begin() + 2); 

Takiego czegoś też jeszcze nie widziałem ^^ widzę że sporo mam jeszcze przed sobą.. jakoś się przejdzie :)

w każdym razie dziękuje, pomogłeś mi :) co prawda przerobiłem to po swojemu ale działa.
i wygląda to tak (jedna funkcja, del_el_tab, nadprogramowa)

//#include "stdafx.h"
#include <iostream>
#include <cstdlib>
#include <iomanip>

using namespace std;

int rozmiar_tab(int *roz_t) //funkcja deklaryjąca rozmiar tablicy;
{
	cout << "Podaj rozmiar tablicy: " << endl;
    cin >> *roz_t;
return *roz_t;
}

void uzupelnij_tab(int *uzupelnianie_t, int *k) //funkcja zapełniająca tablice;
{
	for (int i = 0; i<*k; i++)
	{
		cout << "Podaj " << i + 1 << " element tablicy: ";
		cin >> uzupelnianie_t[i];
	}
}

void wypisz_tab(int *wypisz_t, int *k) //funkcja wypisująca tablice;
{
	for (int w = 0; w<*k; w++)
	{
		cout << " Element tablicy: " << wypisz_t[w] << endl;
	}
	
cout << endl;
}

int del_el_tab(int *roz_t2, int *del, int *tab1) //funkcja usuwająca element tab;
{
	int *tab2;
	int in;
	*del = *roz_t2;
	
	tab2 = new int[*del];
	
	cout << "podaj indeks tab do usunięcia: ";
	cin >> in;
	cout << endl;
	
	if (in = tab1[*roz_t2])
	{
		tab1++;
	}
		else
		{
		for (int kop = 0; kop<*del; kop++)
		{
		tab2[kop] = tab1[kop];
		}
	}
	
	
	for (int w = 0; w<*del; w++)
	{
		cout << w + 1 << " Aktualny element tablicy: " << tab2[w] << endl;
	}
delete[] tab2;
}

void* deleteItem(int array[], int *size) //funkcja usuwająca element tab - z forum 4programmers.net;
{
  int* newArray = new int[*size-1];
  int indexNew = 0;
  int in;
  
  cout << "podaj element do usuniecia: ";
	cin >> in;
	cout << endl;
	
  for (int index = 0; index < *size; index++)
  {
    if(array[index] != in)
    {
      newArray[indexNew] = array[index];
      indexNew++;
    }
  }
  for (int w = 0; w<*size-1; w++)
	{
		cout << " Aktualny element tablicy: " << newArray[w] << endl;
	}
		delete[] newArray;
}

int main()
{
	int t, del;
	int *tab;

	rozmiar_tab (&t); //wywołanie funkcji rozmiar_tab;
	tab = new int[t];
	
	uzupelnij_tab (tab, &t); //wywołanie funkcji uzupelnij_tab;
	wypisz_tab (tab, &t); //wywołanie funkcji wypisz_tab;
//	del_el_tab (&t, &del, tab);
	deleteItem (tab, &t);
	
	getchar();
	getchar();
	delete[] tab;
    return 0;
}

no i wygląda to tak: http://scr.hu/41nd/tlblh

user image

0

Nazywaj też tematy poprawnie. Lista jest czymś zupełnie innym niż tablica.

0
Juhas napisał(a):

Nazywaj też tematy poprawnie. Lista jest czymś zupełnie innym niż tablica.

Dziękuję i przepraszam, postaram się zapamiętać by dopierać rozważniej nazwę tematu na przyszłość :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1