lista podwieszana

0

Witam,
Męczę się już z funkcją usuwania elementów z listy podwieszanej parę godzin i dalej nie działa mi usuwanie elementu który jest n-ty na liście. Gdy chcę usunąć pierwszy wszystko jest ok. Ma ktoś jakiś pomysł co jest nie tak?

typedef struct utwory							//typ struktury dla utworow
{
       char nazwau[10];
       struct utwory *next;
}utwory;
typedef struct plyty							//typ struktury dla plyt
{
       char nazwap[10];
       struct plyty *next;
       utwory *utw;
       gatunek *gat;
}plyty;
void usunu(plyty **listap)
{
	
	int j=0,i=0;
	char ply[10];
	char ut[10];
	printf("Utwor ktorej plyty chcesz usunac?: ");
	scanf("%s",&ply);
	plyty *p=*listap;
	utwory *e;
	utwory *pom;
	
	
	while(p!=NULL)
	{
		if(strcmp(ply,p->nazwap)==0)
		{
			j=1;
			break;
		}
		p=p->next;

	}
	

	if(j==1)
	{
		e=p->utw;
		printf("Jaki utwor chcesz usunac?: ");
		scanf("%s",&ut);
		while(e!=NULL)
		{
			if(strcmp(ut,e->nazwau)==0);
			{
				i=1;
				break;
			}
			pom=e;
			e=e->next;
			
		}

		

		
		if(i==1)
		{
			if(strcmp(p->utw->nazwau,ut)==0)
			{
				p->utw=p->utw->next;
			}
			else
			{
				pom->next=e->next;
				free(e);
			}
		
		}
		else
		{
			printf("Nie ma takiego utworu. ");
			sleep(2);
		}
	}
	
	else
	{
		printf("Nie ma takiej plyty. ");
		sleep(2);
	}
	
	
	
	
}

Takie rozwiązanie tez nie działa, gdy chciałem usunąć 3 element wyskoczyło okienko program nie odpowiada;/

void usunu(plyty **listap)
{
	
	int j=0,i=0;
	char ply[10];
	char ut[10];
	printf("Utwor ktorej plyty chcesz usunac?: ");
	scanf("%s",&ply);
	plyty *p=*listap;
	utwory *e;
	utwory *pom;
	
	
	while(p!=NULL)
	{
		if(strcmp(ply,p->nazwap)==0)
		{
			j=1;
			break;
		}
		p=p->next;

	}
	

	if(j==1)
	{
		e=p->utw;
		printf("Jaki utwor chcesz usunac?: ");
		scanf("%s",&ut);
		while(e!=NULL)
		{
			if(strcmp(ut,e->nazwau)==0);
			{
				i=1;
				break;
			}
			pom=e;
			e=e->next;
		}

		

		
		if(i==1)
		{
			if(strcmp(p->utw->nazwau,ut)==0)
			{
				p->utw=p->utw->next;
			}
			else
			{
				pom=p->utw;
				while(pom->next!=e)
				{
					pom=pom->next;
				}
				pom->next=e->next;
				free(e);
			}
		}
		else
		{
			printf("Nie ma takiego utworu. ");
			sleep(2);
		}
	}
	
	else
	{
		printf("Nie ma takiej plyty. ");
		sleep(2);
	}
		
	
}
0

pomoże ktoś?;/

0

Zacznij od podziału tego na funkcje, masz straszne poplątanie interfejsa z funkcjonalnością.
Koniecznie skróć program o niepotrzebne zawiłości, np zamiast:

    int j=0;
    while(p!=NULL)
    {
        if(strcmp(ply,p->nazwap)==0)
        {
            j=1;
            break;
        }
        p=p->next; 
    } 
    if(j==1) ...

można napisać:

while((p)&&(strcmp(ply,p->nazwap)) p=p->next;
if(p) ...
0

To nic nie da bo mam liste plyt i kazdy element tej listy posiada adres elementu w ktorym jest nazwa utworu (te 2 struktury) i po prostu musze wyszukac plyte w tej liscie, a pozniej z tej plyty przechodze do utworow i w tej plycie szukam podanego utworu i go chce usunac, ale gdy utwor jest pierwszy na liscie czyli tak jakby znajduje sie w tym elemencie z plyta to wszystko ok usuwa mi sie,ale gdy utwor jest tam gdzies w srodku czy na koncu to za nic nie moge go usunac albo wywala bledy albo po prostu nic sie nie dzieje, zastanawialem sie czy to nie jest gdzies wina ze nowemu elementowi ze struktury utwory przypisuje ta glowe tej listy podwieszonej i pozniej przekazuje kolejne wskazniki czyli
e=p->utw;
while(..)
{
e=e->next;
}
ale wydaje mi sie ze jest ok nie mam pojecia czemu mi to nie dziala;/

0

Nie musisz:

plyty **find(plyty **p,const char *ply)
  {
   while((*p)&&(strcmp(ply,(*p)->nazwap)) p=&((*p)->next);
   return p;
  }
0
plyty **find(plyty **p,const char *ply)
  {
   while((*p)&&(strcmp(ply,(*p)->nazwap))) p=&((*p)->next);
   return p;
  }

void usunu(plyty **listap)														//usuwa utwor z wybranej plyty
{
	
	int j=0,i=0;
	char ply[10];
	char ut[10];
	printf("Utwor ktorej plyty chcesz usunac?: ");
	scanf("%s",&ply);
	plyty *p=*listap;
	utwory *e;
	utwory *pom;
	utwory *pom3;
	plyty *pom2;
	
	pom2=find(&p,ply);
	printf("Jaki utwor chcesz usunac?: ");
		scanf("%s",&ut);
	e=pom2->utw;
	
		
			if(strcmp(pom2->utw->nazwau,ut)==0)
			{
				pom=pom2->utw;
				pom=pom->next;
				free(pom);
			}
			else
			{	
				while(strcmp(e->nazwau,ut)!=0) e=e->next;
				pom3=p->utw;			
				 while(pom3->next!=e) pom3=pom3->next;
				 pom3->next=e->next;
				 free(e);
			}
		
	
}

cos takiego,bo dalej nie moge usunac;/

0

Jeszcze raz powtarzam podziel to na funkcje.
Sama funkcja ma wyglądać tak: void usunu(plyty **listap,const char *ply,const char *ut)

0

Tylko gdy podzielę to na funkcje mój problem się nie rozwiąże, będę mieć inny kod, ale będzie tak samo działać.

0

Nie wiem ja jakos wole wszystko w jednej funkcji. wiem ze profesjonalnie to nie wyglada ale w koncu zadzialalo

void usunu(plyty **listap)														//usuwa utwor z wybranej plyty
{
	
	int j=0,i=0;
	char ply[10];
	char ut[10];
	printf("Utwor ktorej plyty chcesz usunac?: ");
	scanf("%s",&ply);
	plyty *p=*listap;
	utwory *e;
	utwory *pom;
	

	
	while(p!=NULL)
	{
		if(strcmp(ply,p->nazwap)==0)
		{	
			j=1;
			break;
		}
		p=p->next;

	}
	

	if(j==1)
	{
		e=p->utw;
		printf("Jaki utwor chcesz usunac?: ");
		scanf("%s",&ut);
		while(e!=NULL)
		{
			if(strcmp(ut,e->nazwau)==0);
			{
				i=1;
				break;
			}
			pom=e;
			e=e->next;
		}

		

		
		if(i==1)
		{
			if(strcmp(p->utw->nazwau,ut)==0)
			{
				pom=p->utw;
				p->utw=p->utw->next;
				free(pom);
			}
			else
			{		
				 pom=p->utw;		
				 while(strcmp(pom->next->nazwau,ut)!=0)
				 {
				 	pom=pom->next;
				 }
				 pom->next=pom->next->next;
				 
			}
		}
		else
		{
			printf("Nie ma takiego utworu. ");
			sleep(2);
		}
	}
	
	else
	{
		printf("Nie ma takiej plyty. ");
		sleep(2);
	}
		
	
}
0
makoyork napisał(a):

Nie wiem ja jakos wole wszystko w jednej funkcji.
Dopóki będziesz tak woleć to będziesz tracić po 10 godzin na byle co. Dopiero jak nauczysz się rozbijać to na małe funkcje będziesz w stanie bez problemów robić wszystko w jednej - ale wtedy już nie będziesz tego chciał tak robić.

1

Długie funkcje mają jedną zaletę - łatwo się w nich zgubić.

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