Własnoręczna funkcja tworząca listę jednokierunkową

0

Czołem Programiści. Mam następujący problem z listą jednokierunkową. Chcę utworzyć własną funkcję która tworzy listę (utwListe()). Funkcja ta korzysta jeszcze z innej również własnoręcznie napisanej funkcji która tworzy element wraz z alokacją pamięci. Problem polega na tym że gdy chcę wywołać funkcję dla wskaźnika który na nic nie wskazuje, po wywołaniu funkcji wyswietlListe() nie otrzymuję żadnych wartości. Natomiast jeśli pusty wskaźnik potraktuję funkcją utwElement() przed wykorzystaniem funkcji utwListe() wszystko działa dobrze. Pomożecie?

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

typedef struct str {
	int n;
	struct str * next;
}str;

struct str * utwElement(int dana){
	struct str * tmp;
	tmp = (struct str *) malloc(sizeof(struct str));
	tmp->n = dana;
	tmp->next = NULL;
	return tmp;
}

void utwListe(struct str * first, int liczbaElementow){
	struct str * tmp;
	tmp = first;
	
	if (tmp == NULL){
		tmp = utwElement(0);
		liczbaElementow--;
	}
	
	else {
		while (tmp->next != NULL){
			tmp = tmp->next;
		}
	}
	
	for (int i = 1; i <= liczbaElementow; i++){
		tmp->next = utwElement(i); 
		tmp = tmp->next;
	}
}

void wyswietlListe(struct str * first){
	struct str * tmp = first;
	while (tmp != NULL){
		printf("%d\n", tmp->n);
		tmp = tmp->next;
	}
}

int main(){
	struct str * wsk = NULL;
	//wsk = utwElement(5); 
	utwListe(wsk, 5);
	wyswietlListe(wsk);
}
1
void utwListe(struct str * first, int liczbaElementow)

operujesz na kopii zmiennej first. Albo zwróc tę wartość

struct str* utwListe(struct str* first, int liczbaElementow) {
    ...
    return first;
}

albo przekaż wskaźnik do wskaźnika, ale wtedy jest więcej brzydkiej zabawy:

void utwListe(struct str** first, int liczbaElementow)
1

Jest też bardziej logiczne podejście:

typedef struct node
  {
   int n;
   struct node *next;
  }node;
typedef struct list
  {
   node *head,*tail;
  }list;

Trzymanie wskaźników na początek i koniec znacznie ułatwi wstawianie elementów na koniec listy.

Poza tym było wałkowano już z tysiąc razy: http://4programmers.net/Forum/Szukaj?q=lista+jednokierunkowa

0

Problem rozwiązany. Dzięki za pomoc.

 
struct str * utwListe(struct str * first, int liczbaElementow){     
	struct str * tmp = first;
	int i = 0;
	if (tmp == NULL){
		tmp = utwElement(i);
		first = tmp;
		i++;
		liczbaElementow--;
	}
	else {
		while (tmp->next != NULL){
			tmp = tmp->next;
			i++;
		}
	}
	int k = 0;
	while (k < liczbaElementow){
		tmp->next = utwElement(i);
		tmp = tmp->next;
		i++;
		k++;
	}
	
	return first;
	
}

0

To nie jest sensowne rozwiązanie, to jest jeden wielki WTF!
Jak chcesz dodawać na koniec listy to trzymaj również wskaźnik na ostatni element, inaczej wywalasz cały zysk z list, normalnie zamień na dynamiczne tablice.

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