Lista dwukierunkowa [C] - struktury

Witam! Usiłuję napisać listę wiązaną dwukierunkową korzystając ze struktur. Po wielu h udało mi się napisać, jednak program nie działa. Prosiłbym o pomoc,wskazanie błędów i ewentualne poprawienie.

#include 

#include 

#include 


typedef struct element

{

	int v;

	struct element *nast, *pop;

}elementy;


struct element *pocz=NULL;

struct element *koniec=NULL;

int sizee=0;



 struct element *push_front(elementy *p, int w)

 {

	  p->nast = pocz; 

	  p->pop = NULL;

      if(pocz) 

		  pocz->pop = p;

      pocz = p;

      if(!koniec) 

		  koniec = pocz;

	  p->v=w;

      sizee++;

      return pocz;

 }


 struct element *push_back(elementy *p, int w)

 {

      if(koniec) 

		  koniec->nast = p;

      p->nast = NULL;

	  p->pop = koniec;

      koniec = p;

      if(!pocz) 

		  pocz = koniec;

	  p->v=w;

      sizee++;

      return koniec;

 }


 struct element *insert(elementy *p1, elementy *p2, int w)

 {

	  int temp;

      p1->nast = p2->nast; 

	  p1->pop = p2;

      p2->nast = p1;

      if(p1->pop) 

		  p1->nast->pop = p1;

      else koniec = p1;

	  p1->v=temp;

	  p2->v=p1->v;

	  p1->v=w;

      sizee++;

      return p1;

 }


struct element *pop_front()

{

      elementy *p;      

      if(pocz)

      {

        p = pocz;

        pocz = pocz->nast;

        if(!pocz) 

			koniec = NULL;

        else pocz->pop = NULL;

        sizee--;

        return p;

      }

      else return NULL;

}


struct element *pop_back()

{

      elementy *p;      

      if(koniec)

      {

        p = koniec;

        if(p == pocz) 

			pocz = koniec = NULL;

        else

			{

				koniec = koniec->pop;

				koniec->nast = NULL;

			}

        sizee--;

        return p;

      }

      else return NULL;

}


struct element *remove(elementy *p)

{

	elementy *p1;


    if(p->pop)

		p->pop->nast = p->nast;

    else pocz = p->nast;

    if(p->nast) 

		p->nast->pop = p->pop;

	else koniec = p->pop;

    sizee--;

    return p;

} 


void print()

{

	elementy *p;

	if(!pocz) 

		printf("Lista jest pusta \n");

      else

      {

		p = pocz;

        while(p)

        {

          printf("%d", p->v);

          p = p->nast;

        }

        printf("\n");

      }

}


void print_backward()

{

	elementy *p;

	if(!koniec) 

		printf("Lista jest pusta \n");

      else

      {

		p = koniec;

        while(p)

        {

          printf("%d", p->v);

          p = p->pop;

        }

        printf("\n");

      }

}


struct element *at(int n)

{

      elementy *p;


      if((!n) || (n > sizee)) 

		  return NULL;

      else if(n == sizee) 

		  return koniec;

      else if(n < sizee / 2)

      {

        p = pocz;

        while(--n) p = p->nast;

        return p;

      }

      else

      {

        p = koniec;

        while(sizee > n++) p = p->pop;

        return p;

      }  

}


int front()

{

	return pocz->v;

}


int back()

{

	return koniec->v;

}


int size()

{

	return sizee;

}


int isEmpty(elementy *p)

{

	if (p==NULL)

		return 0;

	else if(p!=NULL)

		return 1;

}



int main()

{

	int s,t,war, il, kt,z, us,i,ktr,wart;

	struct element el; 


	printf("\n\nAktualna liczba elementow listy %d\n\n", size());


	printf("\n\nCo chcesz zrobic?\n");

	printf("1. Wpisac elementy od poczatku listy\n");

	printf("2. Wpisac element od konca listy\n\n");

	scanf("%d", &s);

	system("cls");

	switch(s)

	{

		case 1:

				printf("Ile elementow chcesz wpisac?\n");

				scanf("%d", &il);

				for(i=1; i
				{

					printf("Podaj wartosc elementu?\n");

					scanf("%d", &war);

					push_front(&el, war);

				}

				break;

		case 2:

				printf("Ile elementow chcesz wpisac?\n");

				scanf("%d", &il);

				for(i=1; i
				{

					printf("Podaj wartosc elementu?\n");

					scanf("%d", &war);

					push_back(&el, war);

				}

	}

	system("CLS");


	printf("\n\nAktualna liczba elementow listy %d\n\n", size());


	printf("\n\nCo chcesz zrobic?\n");

	printf("1. Usunac pierwszy element listy\n");

	printf("2. Usunac ostatni element listy\n\n");

	printf("3. Usunac dowolny element listy\n");

	printf("4. Wpisać element w środku listy\n\n");

	printf("5. Wyswietlic liste\n\n");

	scanf("%d", &t);

	system("CLS");

	switch(t)

	{

		case 1: 

				pop_front();

				printf("Pierwszy element usuniety \n");

				break;

		case 2:

				pop_back();

				printf("Ostatni element usuniety \n");

				break;

		case 3:

				printf("Ktory elemnt chcesz usunac?\n");

				scanf("&d", &kt);

				remove(at(kt));

				printf("\nWybrany element zostal usuniety\n");

				break;

		case 4:

				printf("\n\nAktualna liczba elementow listy %d\n\n", size());

				printf("Ktory element chcesz wpisac?\n");

				scanf("%d", &ktr);

				printf("Podaj wartosc tego elementu\n");

				scanf("%d", &wart);

				insert(at(ktr), at(ktr-1), wart);

				printf("Element dodany\n");

		case 5:

				printf("\n\nCo chcesz zrobic?\n");

				printf("1. Wyswietlic pierwszy element listy\n");

				printf("2. Wyswietlic ostatni element listy\n\n");

				printf("3. Wyswietlic cala liste\n");

				printf("4. Wyswietlic cala liste od konca\n");

				scanf("%d", &z);

				switch(z)

				{

				case 1:

					   printf("Pierwszy element listy = %d", front());

					   system("PAUSE");

					   break;

				case 2:

					   printf("Ostatni element listy = %d", front());

					   system("PAUSE");

					   break;

				case 3:

						printf("Zawartosc listy: \n");

						print();

						system("PAUSE");

						break;

				case 4: 

						printf("Zawartosc list od konca: \n");

						print_backward();

						system("PAUSE");

						break;

				}


	}

	system("CLS");

	printf("Czy chcesz usunac cala liste?\n");

	printf("1. Tak\n");

	printf("2. Nie \n");


	if(us==1)

	{

		while(size())

			pop_front();

		printf("Lista wyczyszczona\n");

	}


	printf("\n\nAktualna liczba elementow listy %d\n\n", size());


	if(isEmpty(&el)==1)

		printf("Lista posiada elementy\n)");

	else printf("Lista jest pusta\n");



	system("PAUSE");

	return 0;

}

Skoro piszesz na forum to zapewne program nie działa.

Ale co nie działa? Wysil się trochę, nie wszyscy mają czas by analizować cały kod linia po linii albo zapisywać na dysku i kompilować. A podając szczegóły, ktoś bystrym okiem może wyłapać błąd lub podać miejsce zaczepienia dzięki któremu rozwiążesz problem.

To od Ciebie zależy najbardziej w jakim czasie problem zostanie rozwiązany.

Program wyrzuca następujące błędy, jednak moim zdaniem, w tych miejscach jest wszystko ok.

"error C2040: ‘remove’ : element *(elementy*)’ differs in levels of indirection from ‘int (const char*)’ wiersz 96

warning C4133: function: incompatible types - from element* to const char. wiersz 246

Po usunięciu funkcji remove program też w niektórych momentach się krzaczy… ech… nie mam już na to siły…

Tak patrząc tylko na to, co wyrzuca kompilator, to uchybienia w składni są następujące:

  1. Jest konflikt twojej funkcji remove() z tą, która już istnieje:

http://www.cplusplus.com/reference/clib … io/remove/

struct element *remove(elementy *p)    {       elementy *p1;[/code] ten wskaźnik[i] elementy *p1;[/i] nie jest używany.



3. 
[code=php]scanf("d", kt);

 %d, nie d.



4. 

int isEmpty(elementy *p)    {       if (p==NULL)          return 0;       else if(p!=NULL)          return 1;    }[/code] Kompilator rzuca ostrzeżenie, a co jeżeli żaden warunek się nie spełni. To może po prostu 
[code=php]int isEmpty(elementy *p)    {       if (p==NULL)          return 0;       else;    } to i on będzie spokojny?



5. 

     struct element *insert(elementy *p1, elementy *p2, int w)     {         int temp;          p1-nast = p2-nast;         p1-pop = p2;          p2-nast = p1;          if(p1-pop)            p1-nast-pop = p1;          else koniec = p1;         p1-v=temp;         p2-v=p1-v;         p1-v=w;          sizee++;          return p1;     }[/code] Przypisujesz do czegoś zawartość [i]temp[/i], a ta zmienna nie została zainicjalizowana.



6. 
[code=php]       if(us==1)

 to samo tutaj, co wyżej, tylko z us.

177, rzuć okiem tu: http://forum.4programmers.net/C_i_C++/2 … _struktury

Fajnie odrabiacie zadanie za nieroba.

Hmm, po prostu potrzebowałem pilnie wskazówki, co jest źle w moim programie. Po czym po kilku wskazówkach całym program poprawiłem sam.

Fajnie, poprawiłeś sam metodą ?

Czy jakaś funkcja została ci bez zmian po tych poprawkach?

Jeżeli tak to znaczy nie posłuchałeś (może nie zrozumiałeś) większości słusznych uwag.

lista *new_list() {

        lista *t = (lista*)malloc(sizeof(lista));

        t->poczatek = NULL;

        t->koniec = NULL;

        t->rozmiar = 0;

}

Zasugerowanie w/w funkcji spowodowało, iż potrafiłem rozwiązać problem poprawnego działania programu. Co wymusiło zmianę każdej funkcji. A w zasadzie zastosowanie wskaźnika struktury w funkcji main, nie struktury, co rozwiązało problem zapętlania się programu.