Le të jetë lista e lidhur 1-> 2 -> 3 ->4
funksioni në c është--
struct linked_node * reverse_recursive(struct linked_node * head)
{
struct linked_node * first;/*stores the address of first node of the linked
list passed to function*/
struct linked_node * second;/* stores the address of second node of the
linked list passed to function*/
struct linked_node * rev_head;/*stores the address of last node of initial
linked list. It also becomes the head of the reversed linked list.*/
//initalizing first and second
first=head;
second=head->next;
//if the linked list is empty then returns null
if(first=NULL)
return(NULL);
/* if the linked list passed to function contains just 1 element, then pass
address of that element*/
if(second==NULL)
return(first);
/*In the linked list passed to function, make the next of first element
NULL. It will eventually (after all the recursive calls ) make the
next of first element of the initial linked list NULL.*/
first->next=NULL;
/* storing the address of the reverse head which will be passed to it by the
condition if(second==NULL) hence it will store the address of last element
when this statement is executed for the last time. Also here we assume that
the reverse function will yield the reverse of the rest of the linked
list.*/
rev_head=reverse(second);
/*making the rest of the linked list point to the first element. i.e.
reversing the list.*/
second->next=first;
/*returning the reverse head (address of last element of initial linked
list) . This condition executes only if the initial list is 1- not empty
2- contains more than one element. So it just relays the value of last
element to higher recursive calls. */
return(rev_head);
}
tani ekzekuton funksionin për listën e lidhur 1-> 2-> 3 -> 4
- brenda reverse(&1) kodi funksionon derisa rev_head=reverse(&2); // këtu &1 është adresa e 1.
lista e funksionit është
1(i pari)->2(e dyta) -> 3 -> 4
brenda kodit reverse(&2) ekzekutohet derisa rev_head=reverse(&3); lista e funksionit
2(i pari)->3 (i dyti)-> 4
kodi brenda reverse(&3) shkon derisa rev_head=reverse (&4); lista nëse funksioni
3(i pari)-> 4 (i dyti)
brenda kushtit përfundimtar reverse(&4) second==NULL është e vërtetë kështu që kthimi ekzekutohet dhe adresa e 4 kthehet.
lista e funksionit
4 (e para) -> NULL (e dyta)
- kthimi në listën reverse(&3) të funksionit është
NULL‹-3(first) 4 (e dyta)
dhe vlera e rev_head=&4 e cila u kthye
pas ekzekutimit second->next=first; lista bëhet
NULL‹- 3 (e para) ‹-4 (e dyta)
kthimi (rev_head); ekzekutohet i cili kalon &4 sepse rev_head=&4
lista në funksion është
NULL‹-2(e para) 3(e dyta)‹-4
dhe rev_head është &4 që u kthye nga rev(&3)
pas ekzekutimit second->next=first, lista bëhet
NULL‹-2(e para)‹-3(e dyta)‹-4
kthimi (rev_head); ekzekutohet i cili kthen &4 në rev(&1);
lista në funksion është
NULL‹-1(e para) 2(e dyta)‹-3‹-4
dhe vlera e rev_head është &4 e cila u kalua me reverse(&3)
tani second->next =first ekzekutohet dhe lista bëhet
NULL‹-1(e para) ‹- 2(e dyta)‹-3‹-4
kthimi (rev_head); ekzekutohet // rev_head=&4 i cili u kthye me reverse(&2) dhe vlera e rev_head i kalohet funksionit kryesor.
shpresoj se kjo ndihmon. M'u desh mjaft kohë për ta kuptuar këtë dhe gjithashtu për të shkruar këtë përgjigje.
21.03.2017