Wstawienie elementu do tablicy na początku/końcu.

0

Cześć,
mam problem z algorytmem wstawiania elementu do tablicy na jej początku lub końcu. Wstawienie na początku działa, ale jest zrobione metodą, która w pewnych warunkach daje nieoczekiwane efekty. Wstawienie na końcu działa dla 2 liczb, przy trzeciej pojawia się błąd pamięci. Bardzo proszę o pomoc w zalezieniu błędu.

	void nowy_poczatek(int wartosc)
	{
		if (rozm == 0)
		{
			rozm++;
			tab = new int[rozm];
			tab [0] = wartosc;
		}
		else
		{
			int *temp = new int [rozm];
			for (int i=0; i<rozm; i++)
				temp[i] = tab[i];
			rozm++;
			tab = new int[rozm];
			tab[0] = wartosc;
			for (int i=0; i<rozm; i++)
				tab[i+1]=temp[i];
			delete []temp;
		}
	}

	void nowy_koniec(int wartosc)
	{
		if (rozm == 0)
		{
			rozm++;
			tab = new int[rozm];
			tab [0] = wartosc;
		}
		else
		{
			int *tmp=new int[rozm];
			memcpy(tmp,tab,rozm*sizeof(int));
			delete[] tab;
			tab=tmp;
			tab[rozm++]=wartosc;
        }
	} 
1
void nowy_poczatek(int wartosc) {
	if (rozm == 0) {
		rozm++;
		tab = new int[rozm];
		tab[0] = wartosc;
	} else {
		int *temp = new int[rozm];
		memcpy(temp, tab, rozm*sizeof(int));
		delete[] tab;
		tab = new int[rozm + 1];
		tab[0] = wartosc;
		memcpy(&tab[1], temp, rozm*sizeof(int));
		delete[] temp;
		rozm++;
	}
}

void nowy_koniec(int wartosc) {
	if (rozm == 0) {
		rozm++;
		tab = new int[rozm];
		tab[0] = wartosc;
	} else {
		int *temp = new int[rozm];
		memcpy(temp, tab, rozm*sizeof(int));
		delete[] tab;
		tab = new int[rozm + 1];
		memcpy(tab, temp, rozm*sizeof(int));
		delete[] temp;
		tab[rozm] = wartosc;
		rozm++;
	}
}
1

Twoja tablica tymczasowa w funkcji nowy_koniec ma zły rozmiar. Powinna mieć o 1 większy:

int *tmp=new int[rozm + 1];
3

Wystarczy tyle:

void nowy_poczatek(int wartosc)
  {
   int *temp=new int[rozm+1];
   memcpy(temp+1,tab,rozm*sizeof(int));
   delete[] tab;
   tab=temp;
   ++rozm;
   tab[0]=wartosc;
  }

void nowy_koniec(int wartosc)
  {
   int *temp=new int[rozm+1];
   memcpy(temp,tab,rozm*sizeof(int));
   delete[] tab;
   tab=temp;
   tab[rozm++]=wartosc;
  }
1

Ok spoko dla mnie to nawet tyle:

void nowy_poczatek(int wartosc) {
	tab = (int*)realloc(tab, (rozm + 1) * sizeof(int));
	memmove(tab + 1, tab, rozm * sizeof(int));
	rozm++;
	tab[0] = wartosc;
}

void nowy_koniec(int wartosc) {	
	tab = (int*)realloc(tab, (rozm + 1) * sizeof(int));
	tab[rozm] = wartosc;
	rozm++;
}
1

No to jeszcze skracamy wraz z dodaniem nowej możliwości i bez niebezpieczeństwa niekompatybilności z delete[]:

void nowy_indeks(size_t pos,int wartosc)
  {
   int *temp=new int[++rozm];
   memcpy(temp,tab,pos*sizeof(int));
   tab[pos]=wartosc;
   memcpy(temp+pos+1,tab+pos,(rozm-pos-1)*sizeof(int));
   delete[] tab;
   tab=temp;
  }

void nowy_poczatek(int wartosc) { nowy_indeks(0,wartosc); }
void nowy_koniec(int wartosc) { nowy_indeks(rozm,wartosc); }

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