0

In this code i want to delete any element in the list this is being done by delpos, i am using memcmp to do it, i am doing this as i have to use this same logic in another program where i get a value and i have to compare that value present in the linked list,(there i wll be comparing structure so strating off with just an integer) can any one please tell what mistake i have done in delpos, while displaying it is displaying some junk values.

#include<stdio.h>
#include<stdlib.h>

void insertbeg();
void delpos();
void display();

struct node {
    int info;
    struct node *link;
} *first = NULL;

struct node *create();
int item, key;

main() {
    int choice;
    while (1) {
        printf("\nchoices are:\n");
        printf("\n1.Insertbeg\n2.delpos\n3.display\n4.exit\n");
        printf("Enter U'r choice: ");
        scanf("%d", &choice);
        switch (choice) {
            case 1: insertbeg();
                break;
            case 2: delpos();
                break;
            case 3: display();
                break;
            case 4: exit(1);
            default: printf("INVALID CHOICE TRY AGAIN\n");

        }
    }
}

struct node *create() {
    struct node *new;
    new = (struct node*) malloc(sizeof (struct node));
    return (new);
}

void insertbeg() {
    struct node *new;
    new = create();
    printf("Enter element to be inserted: ");
    scanf("%d", &item);
    if (first == NULL) {
        new->info = item;
        new->link = NULL;
        first = new;
    } else {
        new->info = item;
        new->link = first;
        first = new;
    }
}

void delpos() {
    int key;
    struct node *temp, *prev = NULL;
    int cmp_value, cmp_value1;
    if (first == NULL) {
        printf("LIST IS EMPTY\n");
        return;
    } else {
        temp = first;
        printf("Enter the KEY element which is to be deleted: ");
        scanf("%d", &key);
        while (temp->link != NULL) {
            cmp_value = memcmp(&temp->info, &key, 4);
            if (cmp_value == 0) {
                if (prev == NULL)
                    first = temp->link;
                else
                    prev->link = temp->link;
            }
            else {
                prev = temp;
                cmp_value1 = memcmp(&temp->info, &key, 4);
                temp = temp->link;
                free(temp);
            }            
        }
    }
}
roirodriguez
  • 1,685
  • 2
  • 17
  • 31
pradeep
  • 33
  • 2

1 Answers1

1

It seems that your delete condition is not in the right way :

     cmp_value = memcmp(&temp->info, &key, sizeof(int)); // sizeof(int) is better than 4
     if (cmp_value == 0)            // here, the items are the same, so you should delete it
     {
        if (prev == NULL)
           first = temp->link;
        else
           prev->link = temp->link;
           // I think you missed a free(temp); here
     }else                          // here, the items are different
     {
        prev = temp;
        cmp_value1 = memcmp(&temp->info, &key, 4);    // why are you comparing again items ??
        temp = temp->link;
        free(temp);                       // why are you freeing the item ?
     }
     // you have to change the value of your temp pointer at the end of the while loop, otherwise, you are not going to correctly check all the items.
Cédric Julien
  • 78,516
  • 15
  • 127
  • 132