首页 文章

删除之前未知删除节点双重链接链表

提问于
浏览
0

在我第一次使用addTrash之后,再到第一次使用modifyMainList迭代之后,由于我将通过modifyMainList从主列表中取出的索引位置中的空值,因此会出现段错误 . addTrash不应该删除任何东西,所以我认为它必须是指针问题,但我不确定 .

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

struct node {
    int value;
    struct node *next, *previous;
};

struct node * modifyMainList(struct node *mainHead, int link2Delete){

    printf("inside modify list\n\n");
    struct node *curr, *temp;
    temp = NULL;
    curr = mainHead;
    int i;

    for (i = 0; i < link2Delete; i++){

        printf("%d\n", i);
        curr = curr -> next;
    }

    if(curr -> previous == NULL){

        temp = curr;
        curr = curr -> next;

        curr -> previous = NULL;

        temp -> next = NULL;
        free(temp);

        return mainHead;
    }else{

        if((curr -> next == NULL) && (curr -> previous != NULL)){

            temp = curr;
            curr = curr -> previous;
            curr -> next = NULL;

            temp -> previous = NULL;
            free(temp);

            return mainHead;
        }else{

            temp = curr;
            curr = curr -> previous;
            curr -> next = curr -> next -> next;
            curr = temp -> next;
            curr -> previous = curr -> previous -> previous;

            temp -> previous = NULL;
            temp -> next = NULL;
            free(temp);

            return mainHead;            
        }
    }
}

struct node * addTrash(struct node *trashHead, struct node *mainHead, int link2Delete){

    struct node *curr = mainHead, *trashCurr = NULL, *temp = NULL;
    int i = 0;

    for(i = 0; i < link2Delete; i++){

        curr = curr -> next;
    }

    printf("inside addTrash\n\n");
    if(trashHead == NULL){

        trashHead = curr;
        trashHead -> previous = NULL;
        trashHead -> next = NULL;


        return trashHead;

    }else{

        trashCurr = trashHead;
        while(trashCurr -> next != NULL){

            trashCurr = trashCurr -> next;
        }

        trashCurr -> next = curr;
        temp = curr;
        temp -> previous = trashCurr;
        temp -> next = NULL;

        temp = NULL;
        free(temp);

        trashCurr = NULL;
        free(trashCurr);

        return trashHead;

    }
}

//Traverses and prints out data from left to right
void TraverseLeftRight(struct node *head){

    struct node *current;
    current = head;

    while(1){
        if(current != NULL){

            printf("Left to right output:           %d\n", current -> value);
            current = current -> next;
        }else{
            break;
        }           
    }
}


//Traverses and prints out data from right to left
void TraverseRightLeft(struct node *tail){

    struct node *current;


    current = tail;

    while(1){
        if(current != NULL){

            printf("Right to left output:           %d\n", current -> value);
            current = current -> previous;
        }else{
            break;
        }           
    }
}


//inserts a node into the doubly linked linked-list
struct node * insertIntoList(struct node *head, int value){

    int i;
    struct node *current, *temp;

    for(i = 0; i < value; i++){

        //Case 1: List empty
        if (i == 0){

            //create node and assign all pointers and values
            temp = (struct node *) malloc(sizeof(struct node));
            temp -> value = i;
            temp -> next = NULL;
            temp -> previous = NULL;
            head = temp;
            current = head; 
            printf("Input data:             %d\n", current -> value);


        }else{

            //create node and assign pointers and values
            temp = (struct node *) malloc(sizeof(struct node));
            temp -> value = i;
            temp -> next = NULL;

            //assign pointer of previous for temp to the current node
            temp -> previous = current;



            //change current node to the node that was just created
            current -> next = temp;
            current = current -> next;  
            printf("Input data:             %d\n", current -> value);

        }
    }
    printf("\n");
    return head;

}

//frees the data on the doubly linked linked-list

void Free(struct node *head){

    struct node *current, *temp;

    current = head;
    temp = head;    

    while(1){
        if(current != NULL){

            current = current -> next;
            temp -> next = NULL;
            temp -> previous = NULL;
            temp -> value = 0;
            free(temp);
            temp = current;

        }else{
            break;
        }           
    }


}

int main(int argv, char **argc){

    struct node *head, *current, *tail, *temp, *trashHead;
    int input, link2Delete = 0, size = 0, y = 0, number2Delete = 0, i;
    head = NULL;
    trashHead = NULL;
    temp = NULL;
    current = NULL;
    tail = NULL;

    //Check to see if there is the correct amount of arguments
    if(argv < 2){
          printf("************************************************\n");
          printf("* You must include a number for size of list.  *\n");
          printf("************************************************\n");

        //exit program
        return 0;

     }else{
        if(argv > 2){
            printf("*****************************************************************\n");
            printf("* You have entered too many arguments, arguments need to be 2.  *\n");
            printf("*****************************************************************\n");

            //exit program
            return 0;

        }else{

            if(argv == 2){

                //convert string to int
                input = atoi(argc[1]);

                //create the doubly linked linked-list
                head = insertIntoList(head, input); 



                //traverse and print values from left to right order
                TraverseLeftRight(head);

                //traverses the list to create the tail
                current = head;

                while(1){
                    if(current != NULL){
                        temp = current;
                        current = current -> next;

                    }else{
                        break;
                    }           
                }   

                tail = temp;

                printf("\n");               

                //traverse and print values from right to left order
                TraverseRightLeft(tail);

                //Generate the random numbers for the corresponding names to be deleted and the numbers of
                //deletions made
                srand( time(NULL) );
                size = input;
                number2Delete = rand() % size + 1;

                printf("\n\nThis is the random number: %d\n", rand());
                printf("This is the nuber of nodes to be deleted: %d\n", number2Delete);

                for(i = 0; i < number2Delete; i++){

                    y = 0;
                    //Pick a random node for deletion
                    link2Delete = (rand() % size);
                    current = head;
                    while(current != NULL){                 

                        current = current -> next;
                        if(current != NULL){
                            printf("this is node: %d\n", y);
                            y++;
                        }
                    }

                    printf("this is the node to be deleted: %d\n\n", link2Delete);
                    size--;

                    trashHead = addTrash(trashHead, head, link2Delete);
                    printf("this is the head of trash: %d\n\n", trashHead -> value);
                    head = modifyMainList(head, link2Delete);           
                }

                Free(head);
                return 0;
            }
        }
    }
}

1 回答

  • 0

    在addTrash中,这看起来很麻烦 . 您将其设置为NULL然后释放?不确定是什么成就 .

    temp = NULL;
        free(temp);
    
        trashCurr = NULL;
        free(trashCurr);
    

    此外,因为它是一个地址,你设置

    trashCurr = trashHead;
    

    如果你释放trashCurr,你也可以释放垃圾头然后返回垃圾头,你刚刚免费

    也许我误解了它,但这很快就看出来了

相关问题