Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

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..