funkcja obsługująca dwie listy

0

Witam
Chciałem aby funkcja zwracała mi dwie listy, więc dodatkowo stworzyłem dodatkową strukturę. Niestety w programie mam problem z jej wywołaniem. Jak mam to zrobic ?

int wybor1(){
	int x=0;
	printf("Witaj w moim programie :) \n\n\n Opcje : \n\n 1.Sprawdz sie\n 2.Edycja \n\n 0.Wyjscie\n");
	scanf("%d",&x);
	return x;
}

typedef struct list{
	struct list *next,*prev;
	char key[30]; 
}lista;

typedef struct lists{
	lista lista_pierwsza;
	lista lista_druga;
}listy;

void push(lista **head,char x[]){
	lista *nowy=(lista*)malloc(sizeof(lista));
	lista *tmp=(lista*)malloc(sizeof(lista));
	strcpy(nowy->key,x);
	nowy->next = NULL;
		if(head) {
			tmp=head;
			while(tmp->next) tmp=tmp->next;
			tmp->next=nowy;
			nowy->prev = head;
			}
		else {
			head=nowy;
			tmp->prev=NULL;
		}
	
}

void show(lista *head){
	
		while(head->next) {
		head=head->next;
		printf("%s\n",head->key);
	}}

listy tworzenie_list(){
	FILE *plik;
	listy nowy;
	int c;
	char z [2]= "";
	char podstawa[30]="";
	char k[30]= "";
	lista *lista_ang=NULL,*lista_pol=NULL;
	
	if ((plik=fopen("C:/test/test.txt", "r+"))==NULL) {					//obsługa błędu otwarcia pliku		
     		printf ("Nie mogę otworzyć pliku test.txt do zapisu!\n");
     		exit(1);}
     		
     	
     		 while((c=fgetc(plik))!=EOF){
			  	if ((c!='\t')&&(c!='\n')){
    				*z=c ;
    				strcat(podstawa,z);    		    	
       			}
       			else if (c=='\t'){
    				push(&lista_ang,podstawa);
    				strcpy(podstawa,k);
    			}
    			else if (c=='\n'){
					push(&lista_pol,podstawa);
    				strcpy(podstawa,k);}}
    nowy.lista_druga = *lista_pol;
    nowy.lista_pierwsza = *lista_ang;
    return nowy;
}

int main(){


	listy x;
	
	
	int stero=0;
	stero=wybor1();
	if(stero==1){	
	x = tworzenie_list();
	show(x.lista_druga);
return 0;
}
0

Niestety w programie mam problem z jej wywołaniem. Jak mam to zrobic ?

Nie potrafisz wywołać funkcji? Dam Ci podpowiedź:
nazwa_funkcji() lub nazwa_funkcji(lista parametrów)

Btw, zamiast zwracać strukturę, znacznie lepszym wyjściem byłoby skorzystanie ze wskaźników:

void tworzenie_list(lista *pierwsza, lista *druga)
{
 *pierwsza = ....
}

int main()
{
 lista pierwsza, druga;
 tworzenie_list(&pierwsza, &druga);
}
  • odnośnie kodu:
    1.Nie powinieneś mieszać angielskich nazw z polskimi.
    2.Te upośledzone wcięcia zamiast ułatwiać czytanie kodu, jedynie go obfuskują.
    3.Zasadniczo nazwy typów powinny być pisane wielką literą (np.Lista), ułatwia to czytanie kodu.
0

Najpier utwórz funkcję pobierającą argument typu listy i zwracającą ten sam typ:

listy operacja_na_listach(listy zestaw)// [1] przekazanie i zwrocenie przez wartosc
{
    //... jakies operacje
    return zestaw;
}

listy* operacja_na_listach(listy* zestaw)// [2] przekazanie i zwrocenie przez wskaznik
{
    //... jakies operacje
    return zestaw;
}

Powyższe funkcje wywołujesz:

listy x, *px;
//...
x = operacja_na_listach(x);//[1]
px = operacja_na_listach(px);//[2]

Oczywiście można do funkcji [1] przekazać wskaźnik a do [2] zmienną.
Rozwiązanie [2] pozwala uniknąć kosztownego kopiowania. Dodatkowo zbyteczne staje się zwracanie przekazanego wskaźnika.

Warto też zastanowić się czy sama struktura listy powinna zawierać zmienne typu lista czy też wskaźniki do typu lista.

Nie należy kopiować wskaźników na zaalokowaną pamięć bez kopiowania wskazywanej przez nie pamięci.Więc struktur zawierających pola wskaźnikowe nie powinno się kopiować bitowo. Powinna robić to przeznaczona do tego funkcja. A zatem nie powinno się ich zwracać ani przez wartość ani przez wskaźnik.

Masz parę błędów.
W funkcji push():

tmp = *head;//zle: tmp=head;
nowy->prev = *head;//zle: nowy->prev = head;
head = &nowy;//zle: head=nowy 

(Head jest wskaźnikiem do wskaźnika. Lepszym rozwiązaniem byłby argument typu referencji do wskaźnika, ale w C chyba to niemożliwe.)
oraz w funkcji main():

if(stero==1){
        //...

        }//brakuje

Być może są jeszcze inne.

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