kamakshi
kamakshi

Reputation: 35

Linked list program in C

I am coding for a simple linked list , but facing a little problem. The program is like it is accepting name, age and DOB through user, and memory for it is dynamically allocated. After taking data from the user, it is searching a name, asked by user, if the name exists, it should print all the details related to it. Here is my code-

//function declarations
struct node *initnode(char *, char *, char *);

void add(struct node *);

struct node *printnode(struct node *);

struct node *searchname(struct node *, char *);

struct node {
    char name[25];
    char age[10];
    char dob[10];
    struct node *next;
};

struct node *head = (struct node *) NULL;

struct node *initnode(char *name, char *age, char *dob1)
{
    struct node *ptr;
    ptr = (struct node *) malloc(sizeof(struct node));
    if (ptr == NULL)
        return (struct node *) NULL;
    else {
        strcpy(ptr->name, name);
        strcpy(ptr->age, age);
        strcpy(ptr->dob, dob1);
        ptr->next = NULL;
        return ptr;
    }

}

struct node *printnode(struct node *ptr)
{
    printf("Name -> %s\n", ptr->name);
    printf("age -> %s \n", ptr->age);
    printf("dob ->%s\n", ptr->dob);
    return ptr;
}

void add(struct node *newp)
{
    struct node *temp = (struct node *) malloc(sizeof(struct node));
    if (head == NULL)
        head = newp;
    else {
        for (temp = head; temp->next != NULL; temp = temp->next);
        temp->next = newp;
        temp = newp;
    }
    free(temp);
}

struct node *searchname(struct node *ptr, char *name1)
{

    if (strcmp(name1, ptr->name) == 0) {
        printf("\n name found \n");
        printf("\n details are -\n");
        printnode(ptr);
        return ptr;
    } else {
        printf("\n name not found in the database \n");
    }

}

int main()
{
    char name[25];
    char name1[25];
    char rep;
    char age[10];
    char dob[10];
    int i;
    int flag = 1;
    struct node *ptr;

    do {
        fflush(stdin);
        while (flag != 0) {
            printf("Enter name -- ");
            gets(name);

            for (i = 0; name[i] != '\0'; i++)
                if (isdigit(name[i])) {
                    printf("Error in user input, name should be in alphabets\n");
                    flag = 1;
                    break;
                }

                else
                    flag = 0;
        }

        flag = 1;

        while (flag != 0) {
            printf("Enter age -- ");
            scanf("%s", &age);
            fflush(stdin);

            for (i = 0; age[i] != '\0'; i++)
                if (isalpha(age[i])) {

                    printf("Error in user input, age should be in numbers\n");
                    flag = 1;
                    break;
                } else {
                    flag = 0;
                }
        }

        flag = 1;
        while (flag != 0) {
            printf("Enter dob in DD/MM/YY format-- ");
            scanf("%s", &dob);
            fflush(stdin);

            for (i = 0; dob[i] != '\0'; i++) {
                if (isalpha(dob[i])) {
                    printf("Error in user input, dob should be in numbers\n");
                    flag = 1;
                    break;
                } else
                    flag = 0;

            }

        }

        flag = 1;

        ptr = initnode(name, age, dob);
        add(ptr);

        printf("\n Do you want to continue?<Y/N>:\n ");
        scanf("%s", &rep);
        //rep = getchar();

    }
    while (rep == 'Y' || rep == 'y');

    printf("\n do u want to search for a name in the database? <Y/N>:\n");
    scanf("%s", &rep);

    if (rep == 'Y' || rep == 'y') {
        printf("Enter name you want to search-- ");
        scanf("%s", &name1);

        ptr = searchname(head, name1);
    } else {
        printf("\n goodbye \n");
    }

    do {
        printf("\n do u want to search again? <Y/N>:\n");
        scanf("%s", &rep);

        if (rep == 'Y' || rep == 'y') {

            printf("Enter name you want to search-- ");
            scanf("%s", &name1);

            ptr = searchname(head, name1);
        } else {
            printf("\n goodbye \n");
        }
    }
    while (rep == 'Y' || rep == 'y');
    return 0;

}

The issue is that it is searching for the first entry only and not others, can anyone help me to sort out this? I am compiling through "gcc".

Upvotes: 1

Views: 1984

Answers (2)

shodanex
shodanex

Reputation: 15406

Check your add function, it is wrong. Step mentally through it, and see what happens to your pointer, and to the memory it points to.

What are the malloc and free used for in the add function?

Upvotes: 1

Flinger
Flinger

Reputation: 61

At a first glance, your search function is only comparing one element, the head of the list.

After comparing one element you must go to the next element. This can either be done recursively or with a while:

Recursive use:

struct node *searchname(struct node *ptr, char *name1)
{
 if (ptr==NULL) //Reached end of the list
 {
  printf("\n name not found in the database \n");
  return NULL;
 }
    if (strcmp(name1, ptr->name) == 0) { //found the element
        printf("\n name found \n");
        printf("\n details are -\n");
        printnode(ptr);
        return ptr;
    } else { //search next element
        return searchname(ptr->next,name1);   //this will call your function again for the next element on the list
    }
}

While use:

struct node *searchname(struct node *ptr, char *name1)
{
 struct node *aux;  // usually i use an auxiliary pointer in order to avoid unwanted overwrite at my pointer.
 aux = ptr;
 while (aux!=NULL)
 {
     if (strcmp(name1, aux->name) == 0) { //found the element
         printf("\n name found \n");
         printf("\n details are -\n");
         printnode(aux);
         return aux;
     }
  else { //move pointer to next element
    aux=aux->next;
   }
 }
 //if it reaches this point, the element was not found
 printf("\n name not found in the database \n");
 return NULL;
}

Upvotes: 1

Related Questions