tags:

views:

47

answers:

2

I have made the following linked list which is not printing the list .The printrecord funtion is not working.Sorry for the long code.

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
struct student
    {
     char *name;
     int roll_no;
     struct student *ptr_next;
    }*ptr_this,*ptr_first;
void PrintMenu(void);
void AddRecord(void);
void DeleteRecord(void);
void SearchRecord(void);
void SortRecord(void);
void PrintRecord(void);
int main()
{
    char choice;
    ptr_this=ptr_first=(struct student*)NULL;
    while(1)
    {
        PrintMenu();
        choice=getche();
        switch(choice)
        {
            case '1':
            AddRecord();
            break;
            case '2':
            DeleteRecord();
            break;
            case '3':
            SearchRecord();
            break;
            case '4':
            SortRecord();
            break;
            case '5':
            PrintRecord();
            break;
            case '6':
            exit(0);
            default:
            printf("Enter a valid choice.\n");
            getch();
        }
    }

}
void PrintMenu(void)
{
    clrscr();
    printf("Database System.\n1.Add Record\n2.Delete Record\n3.Search Record \n4.Sort Records\n5.Display Records\n6.exit");

}
void AddRecord(void)
{
    char temp[100];
    int i;
    struct student *ptr_new;
    ptr_new=(struct student*)malloc(sizeof(struct student));
    if(ptr_new==(struct student*)NULL)
    {
         printf("Sorry but you can not add any more data becasue the computer memory is full.\n");
         return;
    }
    printf("Enter Name:\n");
    gets(temp);
    ptr_new->name=(char*)malloc(sizeof(char)*(strlen(temp)+1));
    strncpy(ptr_new->name,temp,strlen(temp)+1);
    printf("Enter Roll no:");
    gets(temp);
    ptr_new->roll_no=atoi(temp);
    ptr_new->ptr_next=(struct student*)NULL;
    if(ptr_first->ptr_next==(struct student*)NULL)
    {
        ptr_first=ptr_this=ptr_new;
    }
    else
    {
        ptr_this->ptr_next=ptr_new;
        ptr_this=ptr_new;
    }
    printf("Record Successfully added.\n");
    printf("%s",ptr_this->name);
    getch();
}

void DeleteRecord(void)
{
    char temp[100];
    int rec_no,i;
    struct student* ptr_del,*ptr_prev;
    printf("Enter Record Number to be Deleted:\n");
    gets(temp);
    rec_no=atoi(temp);
    ptr_del=ptr_prev=ptr_first;
    for(i=0;ptr_del!=(struct student*)NULL;i++,ptr_del=ptr_del->ptr_next)
    {
        if(i==rec_no)
        {
            if(ptr_del==ptr_first)
                ptr_first=ptr_first->ptr_next;
            else
                ptr_prev->ptr_next=ptr_del->ptr_next;
            free(ptr_del);
            printf("Record #%d has been deleted.",rec_no);
            getch();
            return ;
        }
        ptr_prev=ptr_del;
    }


}
void SearchRecord(void)
{
    struct student *ptr_search;
    char temp[100];
    int roll,flag=0;
    clrscr();
    printf("Enter roll no to search:\n");
    gets(temp);
    roll=atoi(temp);
    ptr_search=ptr_first;
    for(;ptr_search!=(struct student*)NULL;ptr_search=ptr_search->ptr_next)
    {
        if(ptr_search->roll_no==roll)
        {
        flag=1;
        printf("Result Found!\nName:\t%s\nRoll #:\t%d\n",ptr_search->name,ptr_search->roll_no);
        getch();
        return;
        }
    }
    if(flag==0)
    printf("Record not found!\n");
    getch();

}
void SortRecord(void)
{
    struct student *out,*in,*dummy;
    for(out=ptr_first;out!=(struct student*)NULL;out=out->ptr_next)
    {
        for(in=out->ptr_next;out->ptr_next!=(struct student*)NULL;in=in->ptr_next)
        {
            if(!(strcmpi(out->name,in->name)))
            *dummy=*in;
            *in=*out;
            *out=*dummy;
            dummy=in;
            in=out;
            out=dummy;
        }
    }
    printf("Records have been successfully sorted.");
}
void PrintRecord(void)
{
    printf("HEllo");
    getch();
    struct student *ptr_print;
    ptr_print=ptr_first;
    for(;ptr_print!=(struct student*)NULL;ptr_print=ptr_print->ptr_next)
    {
        printf("NAME:\t%s\nROLL#:\t%d\n",ptr_print->name,ptr_print->roll_no);
        printf("Press Enter to display next record or space to exit");
        getch();
    }


}
+1  A: 

Your code should crash when you are trying to add a message (ptr_first is always null). If you don't call AddRecord it is not surprising that PrintRecord outputs nothing - ptr_first is still null.

a1ex07
see the code again, it points to the newly added record
fahad
+2  A: 

The print function is fine, but this is suspicious:

if(ptr_first->ptr_next==(struct student*)NULL)
{
    ptr_first=ptr_this=ptr_new;
}
else
{
    ptr_this->ptr_next=ptr_new;
    ptr_this=ptr_new;
}

I'd say the condition should read

if(ptr_first==NULL)

not sure why you didn't get segfaults in this place...

jpalecek
I am type casting the NULL to the type of structure.
fahad
Yes, this is unnecessary (except for broken compiler/libraries). You could just test against `0`, too. However, the merit is not in the RHS of the `==`, but in the LHS.
jpalecek
Worked :D thanks :D
fahad