简体   繁体   中英

LinkedList functions crash in c

I implemented a linked list in c. when i test it, whenever i reach display function or insert at the end the program crashes. These are the functions:

    struct Node
    {
        char data;
        struct Node *next;
    };
    struct LinkedList
    {
        struct Node *head;
    };
       void insertAtBeginning(struct LinkedList *LL, char ele)
{
    struct Node *new = (struct Node*)malloc(sizeof(struct Node));
    new->data = ele;
    new->next = NULL;
    if(new->data == '\n')return;
    if(LL->head==NULL)LL->head = new;
    else
    {
        new->next=LL->head;
        LL->head=new;
    }
}
void insertAtTheEnd(struct LinkedList *LL, char ele)
{
    struct Node *new = (struct Node*) malloc(sizeof(struct Node));
    new->data = ele;
    new->next = NULL;
    if(LL->head==NULL){LL->head=new;return;}
    struct Node *current = LL->head;
    while(current->next != NULL) {current = current->next;}
    current->next = new;
}
void deleteNode(struct LinkedList* LL, char ele)
{
    struct Node *current = LL->head;
    struct Node *temp = LL->head;
    while(current->next->data!=ele && current!=NULL)current=current->next;
    temp=current->next; 
    current->next=current->next->next;
    free(temp);
}
void deleteFirstNode(struct LinkedList* LL)
{
    struct Node *temp;  
    if(LL->head != NULL)
    {
        temp = LL->head;
        LL->head = LL->head->next;
        free(temp);
    }
}
void displayLinkedList(struct LinkedList LL)
{
    struct Node *current = LL.head;
    printf("List: ");
    while(current != NULL)
    {
        printf("%c",current->data);
        current = current->next;
    }
        printf("\n");
}

This is the main:

    main()
{
    struct LinkedList LL;
    char c = '0';
    //Inserting at beginning
    printf("Type a string. Press Enter to end: ");
    while(c != '\n')
    {
        scanf("%c",&c);
        insertAtBeginning(&LL, c);  
    }
    printf("List: ");
    displayLinkedList(LL);
    printf("\n");
    //Inserting at end
    c='0';
    printf("Type a string. Press Enter to end: ");
    while(c != '\n')
    {
        scanf("%c",&c);
        insertAtTheEnd(&LL, c);     
    }
    printf("List: ");
    displayLinkedList(LL);
    printf("\n");
    //Remove
    printf("Enter a char to remove: ");
    scanf("%c",&c);
    deleteNode(&LL, c);
    printf("\n");
    printf("List: ");
    displayLinkedList(LL);
    printf("\n");
    deleteFirstNode(&LL);
    printf("List: ");
    displayLinkedList(LL);
}

of course This is done after inserting the necessary libraries.

you have to set NULL to next when you create element. if you do not do it, your while loop behaviour will be buggy

void insertAtTheEnd(struct LinkedList *LL, char ele)
{
    struct Node *new =  (struct Node*) malloc(sizeof(struct Node));
    new->next = NULL;
    new->data = ele;
    if(LL->head == NULL) LL->head = new;
    else
    {
    struct Node *current = LL->head;
    while(current->next != NULL) {current = current->next;}
    current->next = new;
    }
}

, and do same for other functions.

also you have to set NULL to your LinkedList.head . so, set NULL when you define LinkedList

struct LinkedList LL;
LL.head = NULL;

i asume the line if(current = LL->head) is wrong
bacause temp = current->next would crash if the result is NULL otherwise the code after the if statement doesnt makes sense

There are some instances where you will try to insert at the end. When you have something of the form node_new->next->prev = node , you must check to make sure that node_new->next is not NULL, because NULL does not have any type and thus does not have a prev field.

You may also consider making all of your functions return int , so that you can know if and what goes wrong.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM