#include<stdio.h>
#include<stdlib.h>
struct Node{
int value;
struct Node * next;
};
int insertNode(struct Node** head,int value){
printf("Insert Node %d\n",value);
struct Node* newNodePtr = (struct Node*)malloc(sizeof(struct Node));
newNodePtr->value=value;
newNodePtr->next=*head; // Now the 'next' of the NEW NODE holds what head held originally = NULL
printf(" address in newNodePtr = %d = address OF the NEW NODE\n",newNodePtr);
printf(" address in newNodePtr->next = %d \n",newNodePtr->next);
printf(" address in *head = %d \n",*head);
printf(" address in head = %d \n",head);
*head=newNodePtr; // I am changing where head is POINTING TO, it now POINTS TO 'newNodePtr'
// i.e. to the NEW NODDE (now holds the address of a POINTER pointing to the NEW NODE
printf("Finally address OF head = %d \n",head);
printf("Finally address in head = *head = %d = address OF the NEW NODE\n",*head);
return 1;
}
void PrintList(struct Node* head){
while(head){
printf("value in nodes is %d \n",head->value);
head = head->next;
}
}
int main(){
int a =10;
int * p = &a; // 'p' points to 'a'
struct Node * head = NULL;
printf("In main, address IN 'head' = %d i.e. head POINTS TO NULL\n",head);
printf("In main, But 'head' has ITS OWN ADDRESS (address of head = '&head') = %d \n",&head);
printf("This address OF head '&head' = %d UNIQUELY IDENTIFIES this LIST and remains",&head);
printf("UNCHANGED throughout\n");
printf("In main, value at address of head '*(&head) = %d = address in 'head'\n",*(&head));
printf("This means address IN 'head' == '*(&head)'\n");
printf("NOTE: 'Node ** head == '&head', POINTER-2-POINTER i.e. ADRRESS of a POINTER\n");
printf("Therefore, '*heaad' == Address held by 'head',i.e. where the head is POINTING TO");
printf(" p = %d\n",p);
printf(" &a = %d\n",&a);
printf(" &p = %d\n",&p);
printf(" *(&p) = %d\n",*(&p));
printf(" *p = %d\n",*p);
printf("(1) This means p == *(&p), where 'p' is any POINTER\n");
printf("(2) This means if you print 'p' you will get '&a', because p=&a\n");
printf("\nSee how the values of newNodePtr, newNodePtr->next\n");
printf("addresses head holds(points to) changes, BUT the address OF HEAD\n");
printf("remains the SAME with each call to insertNode\n\n");
int arr[5]={1,2,3,4,5};
int i;
for(i=0;i<5;i++){
insertNode(&head,arr[i]);
}
PrintList(head);
return 0;
}
Output:
#include<stdlib.h>
struct Node{
int value;
struct Node * next;
};
int insertNode(struct Node** head,int value){
printf("Insert Node %d\n",value);
struct Node* newNodePtr = (struct Node*)malloc(sizeof(struct Node));
newNodePtr->value=value;
newNodePtr->next=*head; // Now the 'next' of the NEW NODE holds what head held originally = NULL
printf(" address in newNodePtr = %d = address OF the NEW NODE\n",newNodePtr);
printf(" address in newNodePtr->next = %d \n",newNodePtr->next);
printf(" address in *head = %d \n",*head);
printf(" address in head = %d \n",head);
*head=newNodePtr; // I am changing where head is POINTING TO, it now POINTS TO 'newNodePtr'
// i.e. to the NEW NODDE (now holds the address of a POINTER pointing to the NEW NODE
printf("Finally address OF head = %d \n",head);
printf("Finally address in head = *head = %d = address OF the NEW NODE\n",*head);
return 1;
}
void PrintList(struct Node* head){
while(head){
printf("value in nodes is %d \n",head->value);
head = head->next;
}
}
int main(){
int a =10;
int * p = &a; // 'p' points to 'a'
struct Node * head = NULL;
printf("In main, address IN 'head' = %d i.e. head POINTS TO NULL\n",head);
printf("In main, But 'head' has ITS OWN ADDRESS (address of head = '&head') = %d \n",&head);
printf("This address OF head '&head' = %d UNIQUELY IDENTIFIES this LIST and remains",&head);
printf("UNCHANGED throughout\n");
printf("In main, value at address of head '*(&head) = %d = address in 'head'\n",*(&head));
printf("This means address IN 'head' == '*(&head)'\n");
printf("NOTE: 'Node ** head == '&head', POINTER-2-POINTER i.e. ADRRESS of a POINTER\n");
printf("Therefore, '*heaad' == Address held by 'head',i.e. where the head is POINTING TO");
printf(" p = %d\n",p);
printf(" &a = %d\n",&a);
printf(" &p = %d\n",&p);
printf(" *(&p) = %d\n",*(&p));
printf(" *p = %d\n",*p);
printf("(1) This means p == *(&p), where 'p' is any POINTER\n");
printf("(2) This means if you print 'p' you will get '&a', because p=&a\n");
printf("\nSee how the values of newNodePtr, newNodePtr->next\n");
printf("addresses head holds(points to) changes, BUT the address OF HEAD\n");
printf("remains the SAME with each call to insertNode\n\n");
int arr[5]={1,2,3,4,5};
int i;
for(i=0;i<5;i++){
insertNode(&head,arr[i]);
}
PrintList(head);
return 0;
}
Output:
$gcc -o main *.c $main In main, address IN 'head' = 0 i.e. head POINTS TO NULL In main, But 'head' has ITS OWN ADDRESS (address of head = '&head') = -1625641784 This address OF head '&head' = -1625641784 UNIQUELY IDENTIFIES this LIST and remainsUNCHANGED throughout In main, value at address of head '*(&head) = 0 = address in 'head' This means address IN 'head' == '*(&head)' NOTE: 'Node ** head == '&head', POINTER-2-POINTER i.e. ADRRESS of a POINTER Therefore, '*heaad' == Address held by 'head',i.e. where the head is POINTING TO p = -1625641768 &a = -1625641768 &p = -1625641776 *(&p) = -1625641768 *p = 10 (1) This means p == *(&p), where 'p' is any POINTER (2) This means if you print 'p' you will get '&a', because p=&a See how the values of newNodePtr, newNodePtr->next addresses head holds(points to) changes, BUT the address OF HEAD remains the SAME with each call to insertNode Insert Node 1 address in newNodePtr = 10371104 = address OF the NEW NODE address in newNodePtr->next = 0 address in *head = 0 address in head = -1625641784 Finally address OF head = -1625641784 Finally address in head = *head = 10371104 = address OF the NEW NODE Insert Node 2 address in newNodePtr = 10371136 = address OF the NEW NODE address in newNodePtr->next = 10371104 address in *head = 10371104 address in head = -1625641784 Finally address OF head = -1625641784 Finally address in head = *head = 10371136 = address OF the NEW NODE Insert Node 3 address in newNodePtr = 10371168 = address OF the NEW NODE address in newNodePtr->next = 10371136 address in *head = 10371136 address in head = -1625641784 Finally address OF head = -1625641784 Finally address in head = *head = 10371168 = address OF the NEW NODE Insert Node 4 address in newNodePtr = 10371200 = address OF the NEW NODE address in newNodePtr->next = 10371168 address in *head = 10371168 address in head = -1625641784 Finally address OF head = -1625641784 Finally address in head = *head = 10371200 = address OF the NEW NODE Insert Node 5 address in newNodePtr = 10371232 = address OF the NEW NODE address in newNodePtr->next = 10371200 address in *head = 10371200 address in head = -1625641784 Finally address OF head = -1625641784 Finally address in head = *head = 10371232 = address OF the NEW NODE value in nodes is 5 value in nodes is 4 value in nodes is 3 value in nodes is 2 value in nodes is 1
No comments:
Post a Comment