[C] Lista dwukierunkowa


(_P_a_w_e_l_) #1

Witajcie,

Przeszukałem kilka forów ale tak na dobrą sprawę nie znalazłem żadnego dobrego artykułu z przykładem implementacji i użycia listy dwukierunkowej.

Proszę o jakiś kompletny przykład / link do strony z materiałem.

 

Na razie jestem na etapie:

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

typedef struct lista{
	int numer;
	char* napis;
	struct lista *next;
	struct lista *prev;
}element_listy;

element_listy* nowy_element(){
	element_listy *nowy;
	char n[32];
	char* wyraz;
	int i;
	
	system("CLS");
	printf("\n\n\tPodaj nr elementu: ");
	scanf("%d",&i);
	
	fflush(stdin);
	printf("\n\tWpisz wyraz: ");
	gets(n);
	wyraz = (char*)malloc(sizeof(char)*(strlen(n)+1));
	strcpy(wyraz,n);
	
	nowy = (element_listy*)malloc(sizeof(element_listy));
	nowy->next = NULL;
	nowy->prev = NULL;
	nowy->numer = i;
	nowy->napis = wyraz;
	
	return nowy;
}

void dodaj(element_listy *head){
	int wybor;
	element_listy *nowy, *tmp;
	
	do{	
		if (head == NULL){
		  nowy = nowy_element();
			head = nowy;
		}
		else{
			tmp=head;
			nowy = nowy_element();
			while (tmp->next != NULL)
				tmp=tmp->next;
			tmp->next = nowy;
		}
	printf("Chcesz dodac kolejny element (t/n)? :");
	wybor=getchar();
 } while (wybor=='t');		
}

void drukuj_liste(element_listy *head)
{
  element_listy *tmp=head;
  
  while(tmp!=NULL)
  {
      printf("\n\nElement: %d, tekst:%s",tmp->numer, tmp->napis);
      tmp=tmp->next;
  }
}


int main(){
  element_listy *head;
  head=NULL;
  
  dodaj(head);
	drukuj_liste(&head);
	
	printf("\n\n\n\t\t\t\tKoniec");
	getch();
	return 0;
}

Nie mogę za bardzo dojść co go wykrzacza oraz dlaczego nie wykonuje najprostszej operacji - drukowania.

Nie wiem też za bardzo jak zeralizować dwukierunkowość.

 


(mikolaj_s) #2

Jaki jest sens posiadania listy dwukierunkowej, którą i tak zawsze przechodzisz od początku (np. w funkcji dodaj)? Powinieneś przechowywać również wskaźnik na koniec, który wykorzystasz do dodania elementu. Może utwórz strukturę lista w odróżnieniu od struktury element listy.

 

W tej chwili program nie działa ponieważ:

void drukuj_liste(element_listy *head)
drukuj_liste(&head);

Przekazujesz do funkcji adres do wskaźnika na head, a funkcja liczy na sam wskaźnik do head.