shiv@ubuntu:~/ds/list$ cat altxchangenode.c
/*
* program to Xchange or swap all the adjecent nodes(not node data) in the single linked list
*/
#include<stdio.h>
#include<stdlib.h>
#define MAX 10
struct list
{
int d;
struct list *next;
};
/*
* function to swap 2 adjecent nodes(linkes) in the list
*/
void xchangenodes(struct list **head, struct list **ne, struct list **tm)
{
struct list *temp, *x1, *x2;
if(*tm == NULL){
return;
}
if((*tm)->next && (*tm)->next->next){
/*next node when more than 3 nodes present in the list */
temp=(*tm)->next->next;
} else if((*tm)->next){
if(*head != NULL) { /* only two nodes present in the list */
(*ne)->next = (*tm)->next;
(*ne)->next->next = *tm;
(*tm)->next = NULL;
} else {
/* last iteration where last 2 nodes we need to swap */
*head=(*ne)->next;
(*head)->next =*tm;
(*tm)->next = NULL;
}
*tm = NULL;
return;
} else {
if(*head ==NULL){ /*if only one node is present*/
*head=*tm;
(*tm)->next = NULL;
} else {
(*ne)->next=*tm; /*only one node left for last iteration */
(*tm)->next = NULL;
}
*tm=NULL; /*terminate loop which calls this function */
return;
}
x1=(*tm);
x2=(*tm)->next;
if(*head == NULL){
/* if more than 3 nodes present in list, adjust head */
x2->next=x1;
x1->next = temp;
*head = x2;
*tm = temp;
*ne=x1;
}
/* swap nodes and set next node after swap*/
x2->next = x1;
x1->next = temp; /*temp hold rest of the list after swaping 2 nodes */
(*ne)->next = x2; /* next iteration we start from (*ne) ie X1 here */
*ne = x1;
*tm= temp; /* ne and temp are not same */
}
/* function to display nodes in the list */
void display(struct list *h)
{
printf("List elements are \n");
while(h !=NULL)
{
printf("%d\n", h->d);
h=h->next;
}
}
/* main function to help test program */
int main()
{
struct list *head=NULL, *temp=NULL, *next=NULL;
/* array to build list and test program */
int a[MAX]={1,2,3,4,5,6,7,8,9,10};
int i;
for(i=0;i<MAX; i++){
temp=malloc(sizeof(struct list));
if(!temp){
printf("Memory allocation failure\n");
return;
}
temp->d = a[i];
temp->next = NULL;
/* building list simply by inserting element at begining */
if(head == NULL){
head = temp;
} else {
temp->next = head;
head = temp;
}
}
display(head);
/* Xchange all adjecent nodes */
temp = next = head;
head = NULL;
while(temp != NULL) {
/* temp is updated in function xchangenodes(), as we can't do
* temp=temp->next here
*/
xchangenodes(&head, &next, &temp);
}
display(head);
}
/*end of program */
Comments
Post a Comment