1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
| #include<stdio.h>
#include<stdlib.h>
typedef struct node{
int data;
struct node* next;
}node;
typedef node* pt ;
pt getNode(){
pt noeud=malloc(sizeof(node));
if(noeud==NULL) {printf("no memorry ! sorry .. \n"); return noeud;}
printf("give me the data : \t ");
scanf("%d",&(noeud->data));
noeud->next=NULL;
return noeud;
}
pt creatList(int n){
pt listhead=getNode(),temp;
if(listhead==NULL) exit(0);
int i;
temp=listhead;
for(i=1;i<n;i++){
temp->next=getNode();
if(temp->next==NULL) exit(0);
temp=temp->next;
}
return listhead;
}
void reverse(pt* listhead){
pt curr=(*listhead)->next ,prec=*listhead,suiv=curr->next;
if(curr && prec && suiv){
while (suiv) {
curr->next=prec;
prec=curr;
curr=suiv;
suiv=suiv->next;
}
}
curr->next=prec;
(*listhead)->next=NULL;
(*listhead)=curr;
}
// cell ci
void reverserecv2(pt* listhead){
pt curr=*listhead,suiv;
//printf("before call : \nargument = %p \tcurr= %p \tcurr->next =%p \n",*listhead,curr,curr->next);
if(curr && curr->next){
suiv=curr->next;
reverserecv2(&((*listhead)->next));
//printf("after call before changing listhead : \nargument = %p \tcurr= %p \tcurr->next =%p \tsuiv =%p\n",*listhead,curr,curr->next,suiv);
suiv->next=curr;
*listhead=curr->next;
//printf("after changing listhead :\nargument = %p \tcurr= %p \tcurr->next =%p \tsuiv =%p\n",*listhead,curr,curr->next,suiv);
suiv->next->next=NULL;
}
}
void screen(pt listhead){
while(listhead){
printf("%d\t",listhead->data);
listhead=listhead->next;
}
printf("\n");
}
int main(int argc, char const *argv[]) {
int n;
pt temp=creatList(4);
screen(temp);
reverserecv2(&temp);
screen(temp);
return 0;
} |
Partager