utworzenie listy dwukierunkowej

0

Mam problemik z moją listą xd obstawiam że zrobiłem jakiś głupi błąd bo program się kompiluje, i jakoś nie mogę wyszukać błędu... pomoże ktos ?

 typedef struct list{
	struct list *next,*prev;
	int key; 
}lista;

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

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

main(){
lista *head = NULL;
int i;
for(i=0;i<4;i++){
	push(head,i);
}
show(head);

   return 0;	
}
1

Po wyjściu z push() zmienna head nadal będzie NULL'em.
Użyj podwójnego wskaźnika lub zwracaj head z funkcji push.
Zastanów się nad zmianą nazwy struktury na listnode oraz stworzeniem struktury:

typedef struct
  {
   struct listnode *first,*last;
  } list;
0

1.Wielkie dzięki, faktycznie miałeś rację z tym podwójnym wzkaźnikiem ciągle o nim zapominam. A możesz wyjaśnić do czego przydatna by była mi ta struktura którą napisałeś ?
2. nie mogłem teraz napisać po zmianie "head->next" więc musiałem zastosować nową zmienną tmp. Czy można tego uniknąć i dalej pracować tylko na head ?

 void push(lista **head,int x){
	lista *nowy=(lista*)malloc(sizeof(lista));
	lista *tmp=(lista*)malloc(sizeof(lista));
	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;
		}
	
}
0
ice25 napisał(a):

A możesz wyjaśnić do czego przydatna by była mi ta struktura którą napisałeś ?

Dla uproszczenia kodu, oraz dodawania na koniec bez jakiejkolwiek pętli:

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

typedef struct _listnode
  {
   struct _listnode *next,*prev;
   int key; 
  } listnode;

typedef struct
  {
   listnode *first,*last;
  } list;

void push(list *L,int x)
  {
   listnode *tmp=(listnode*)malloc(sizeof(listnode));
   tmp->key=x;
   tmp->next=NULL;
   tmp->prev=L->last;
   if(L->last) L->last->next=tmp;
   else L->first=tmp;
   L->last=tmp;
  }
 
void show(list *L)
  {
   listnode *i;
   for(i=L->first;i;i=i->next) printf(" %d",i->key);
  }
 
int main()
  {
   list L={NULL,NULL};
   int i;
   for(i=0;i<4;++i) push(&L,i);
   show(&L);
   return 0;        
  }

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