1. Write new functions for the following: (i) Always insert nodes at the beginni
ID: 3589177 • Letter: 1
Question
1. Write new functions for the following:
(i) Always insert nodes at the beginning of the linked list.
(ii) Considering nodes were inserted following (i), Delete function should delete the "Last occurence" of the number.
Code:
#include<stdio.h>
#include<stdlib.h>
struct node
{
int data;
struct node *next;
}*head;
void append(int num)
{
struct node *temp,*right;
temp= (struct node *)malloc(sizeof(struct node));
temp->data=num;
right=(struct node *)head;
if(right==NULL)
{
add(num)
}
else
{
while(right->next != NULL)
right=right->next;
right->next =temp;
right=temp;
right->next=NULL;
}
}
void add( int num )
{
struct node *temp;
temp=(struct node *)malloc(sizeof(struct node));
temp->data=num;
if (head== NULL)
{
head=temp;
head->next=NULL;
}
else
{
temp->next=head;
head=temp;
}
}
void addafter(int num, int loc)
{
int i;
struct node *temp,*left,*right;
right=head;
for(i=1;i<loc;i++)
{
left=right;
right=right->next;
}
temp=(struct node *)malloc(sizeof(struct node));
temp->data=num;
left->next=temp;
left=temp;
left->next=right;
return;
}
void insert(int num)
{
int c=0;
struct node *temp;
temp=head;
if(temp==NULL)
{
add(num);
}
else
{
while(temp!=NULL)
{
if(temp->data<num)
return;
if(temp->data<num)
c++;
temp=temp->next;
}
if(c==0)
add(num);
else if(c<count())
addafter(num,++c);
else
append(num);
}
}
int delete(int num)
{
struct node *temp, *prev;
temp=head;
while(temp!=NULL)
{
if(temp->data==num)
{
if(temp==head)
{
head=temp->next;
free(temp);
return 1;
}
else
{
prev->next=temp->next;
free(temp);
return 1;
}
}
else
{
prev=temp;
temp= temp->next;
}
}
return 0;
}
void display(struct node *r)
{
r=head;
if(r==NULL)
{
return;
}
while(r!=NULL)
{
printf("%d ",r->data);
r=r->next;
}
printf(" ");
}
int count()
{
struct node *n;
int c=0;
n=head;
while(n!=NULL)
{
n=n->next;
c++;
}
return c;
}
int main()
{
int i,num;
struct node *n;
head=NULL;
while(1)
{
printf(" List Operations ");
printf("=============== ");
printf("1.Insert ");
printf("2.Display ");
printf("3.Size ");
printf("4.Delete ");
printf("5.Exit ");
printf("Enter your choice : ");
if(scanf("%d",&i)<=0){
printf("Enter only an Integer ");
exit(0);
} else {
switch(i)
{
case 1: printf("Enter the number to insert : ");
scanf("%d",&num);
// insert(num);
append(num);
break;
case 2: if(head==NULL)
{
printf("List is Empty ");
}
else
{
printf("Element(s) in the list are : ");
}
display(n);
break;
case 3: printf("Size of the list is %d ",count());
break;
case 4: if(head==NULL)
printf("List is Empty ");
else{
printf("Enter the number to delete : ");
scanf("%d",&num);
if(delete(num))
printf("%d deleted successfully ",num);
else
printf("%d not found in the list ",num);
}
break;
case 5: return 0;
default: printf("Invalid option ");
}
}
}
return 0;
}
Explanation / Answer
Solution================
1) Code for insertion at begining:
void insertAtBegining(int num){
//Creating a node
struct node *temp;
temp= (struct node *)malloc(sizeof(struct node));
//Swapping this to be the head node
temp->data=num;
temp->next=head;
head=temp;
}
2) Modified delete() to delete the last ocuurence of that number
int delete(int num)
{
struct node * temp, * prev;
//Will store reference to the last matched element found,
//And the corresponding prev node
struct node * nodeFound = NULL;
struct node * nodeFoundPrev = NULL;
temp = head;
while (temp != NULL)
{
if (temp - > data == num)
{
nodeFound = temp;
nodeFoundPrev = prev;
} else
{
prev = temp;
temp = temp - > next;
}
}
//Process only if atleast one match has been found
if (nodeFound != NULL) {
//After the last matched node, found and strored in nodeFound
if (nodeFound == head)
{
head = nodeFound - > next;
free(nodeFound);
return 1;
} else
{
nodeFoundPrev - > next = nodeFound - > next;
free(nodeFound);
return 1;
}
}
return 0;
Let me know if any issues, Cheers..
Related Questions
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.