Język C stos

0

Witam szanowni forumowicze. Mam jeden problem. Napisałem dwie funkcje pracujące na stosie czyli: jedna usuwa ze stosu druga dodaje. Problem w tym że nie potrafię napisać funkcji kopiującej stos, tzn: tworzącej jego kopię. Liczę na pomoc jeśli to możliwe. Oto kod.

#pragma hdrstop

#include <stdio.h>
#include<stdlib.h>

struct el
{
 int klucz;
 struct el *nast;
};

 typedef struct el elListy;
 typedef elListy *lista;



//funkcja dodajoaca na stos

void dodaj(lista *l,int k)
{
 lista element;

 element=(lista)malloc(sizeof(elListy));
 element->klucz=k;
 element->nast=*l;
 *l=element;
}

//funkcja usuwajaca ze stosu

int usun( lista *l) {
 lista p;
 int k;
   if (*l!=0){
   p=*l;
   k=(*l)->klucz;
   *l=(*l)->nast;
   free(p);
   p=0;
   return k;
}
   return -1;
}

//funkcja pokazujaca stan stosu

void wyswietlall(lista l)
{
  if (l==NULL)
{
    printf("Brak elementow \n");
}
    else
{
    do {
    printf("%d\n",l->klucz);
    l=l->nast;
}
    while (l!=NULL);
}
}

//glowny program

int main(int argc, char* argv[])
{
  int dec;
  lista li;
  li=NULL;

  printf("Dodawanie na stos liczb 45 55 65\n");
  dodaj(&li,45);

  dodaj(&li,55);

  dodaj(&li,65);
  wyswietlall(li);
  printf("---------------------\n");
  printf("Usuwanie ze stosu....\n");
  usun(&li);
  


  wyswietlall(li);
  
  printf("Usuwanie ze stosu....\n");
  usun(&li);
  


  wyswietlall(li);
  
  printf("Dodawanie na stos liczb 445 555 655\n");
  dodaj(&li,445);

  dodaj(&li,555);

  dodaj(&li,655);
  wyswietlall(li);
  getch();

    return 0;
  }
//---------------------------------------------------------------------------
0

chyba bedzie ok

lista copy(lista src)
{
	elListy *dst, *ptr;
	unsigned int i = 0;

	ptr = src;
	while(ptr != NULL) {
		i += 1;
		ptr = ptr->nast;
	}

	dst = (elListy*)malloc(i * sizeof(elListy));

	ptr = src; i = 0;
	while(ptr != NULL)
	{
		dst[i].klucz = ptr->klucz;
		if(ptr->nast != NULL)
			dst[i].nast = &dst[i+1];
		else
			dst[i].nast = NULL;
		i += 1;
		ptr = ptr->nast;
	}

	return dst;
}
0
lista klonuj(lista l)
{
    if (!l) {
        return 0;
    }

    lista kopia = 0;
    dodaj(&kopia, l->klucz); // musisz zapamiętać początek

    lista element = kopia;
    l = l->nast;
    while(l) {
        dodaj(&element->nast, l->klucz);
        element = element->nast;
        l = l->nast;
    }

    return kopia;
}
0

Dziękuje Ci za pomoc ale z jakim parametrem ją wywołać by sprawdzić czy działa tzn copy(li) ale jak potem chce wyświetlić wyswietl(li) to zwraca te same liczby więc trudno sprawdzić tu działanie tej funkcji :) zrobiłem zmienną: lista ss=0; podpiąłem ss=copy(li) ale printefem chyba tego nie wyrzucę na ekran? printf("%d",ss) ?

0
vipka600 napisał(a)

Dziękuje Ci za pomoc ale z jakim parametrem ją wywołać by sprawdzić czy działa tzn copy(li) ale jak potem chce wyświetlić wyswietl(li) to zwraca te same liczby więc trudno sprawdzić tu działanie tej funkcji :) zrobiłem zmienną: lista ss=0; podpiąłem ss=copy(li) ale printefem chyba tego nie wyrzucę na ekran? printf("%d",ss) ?

Ta moja testuj tak:

nowa_lista = copy(li)
operacje na nowa_lista
wyswietl(nowa_lista)

Natomiast proponuje Ci uzyc funkcji, ktora Marek wrzucil, bo jest bardziej kompatybilna z Twoim kodem, poniewaz korzysta z funkcji dodaj przez co jest krotsza i prostsza.

0

Tak użyje funkcji Marka dziękuje za pomoc.

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