我无法从链接列表中删除所有节点

时间:2019-04-21 22:52:17

标签: c nodes singly-linked-list

我正在做一个学校项目,这是关于用单个链表做事的。我被困了几个小时,我真的不知道该怎么办。基本上,我的任务是从链接列表中删除节点。

这是我当前存储在节点中的内容:

1. Jozef Maly 7502110011 1178.88
2. Maria Krasna 6251034526 1636.90
3. Milan Vesely 9512157831 1835.20
4. asd fgh 9862111680 2000.00
5. lol pop 9862111680 2000.00

这是我当前的结果:

Deleted 2 nodes.                           //not really
1. Jozef Maly muz 11.02.1975 1178.88
2. Maria Krasna zena 03.01.1962 1636.90
3. Milan Vesely muz 15.12.1995 1835.20
4. lol pop zena 11.12.1998 2000.00

这是我的结果应该是这样的:

Deleted 2 nodes.
1. Jozef Maly 7502110011 1178.88
2. Maria Krasna 6251034526 1636.90
3. Milan Vesely 9512157831 1835.20

这是我的代码:

void overRC(struct list *z) {
    int arr[10], notvalidarr[1000];
    int notvalid = 0, x = 0, i = 0, j = 0, k = 0, day, month, year, number;
    int len = length(z); //this function returns the number of nodes

    struct data *temp;
    temp = z->first; //z -> first is the head
    while (temp != NULL) {
        i++;  
        number = temp->ID / 10000;
        for (int j = 0; j < 6; j++) {
            arr[j] = number % 10;
            number /= 10;
        }
        day = 10 * arr[1] + arr[0];
        month = 10 * arr[3] + arr[2];
        year = 1900 + 10 * arr[5] + arr[4];

        if (temp->ID % 11 != 0 || month <= 0 || month > 12 && month < 51 || month > 62 || month == 2 && day > 29 || month <= 7 && month % 2 == 1 && day > 31  || || month <= 7 && month % 2 == 0 && day > 30 || month >= 8 && month % 2 == 0 && day > 31 || month >= 8 && month % 2 == 1 && day > 30) {
            notvalidarr[x++] = i; //i store the positions in this array: 4, 5
        }
        day = 0;
        month = 0;
        year = 0;
        temp = temp->next;
    }

    for (j = 0; j < x; j++) {
        deleteNode(&z->first, notvalidarr[j]);
        notvalid++;
    }
    printf("Deleted %d nodes\n", notvalid);  //it says it deleted 2
}

void deleteNode(struct data **head_ref, int position) { 
    if (*head_ref == NULL) 
        return; 

    struct data *temp = *head_ref; 

    if (position == 1) { 
        *head_ref = temp->next;  
        free(temp);              
        return; 
    } 

    for (int i = 1; i < position - 1; i++) 
        temp = temp->next; 

    if (temp == NULL || temp->next == NULL) 
        return; 

    struct data *next = temp->next->next; 

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

1 个答案:

答案 0 :(得分:0)

由于notvalidarr的测试存在语法错误,因此代码无法编译:{{1​​}}之后是||。您应该使用数月之内的最大值阵列简化该测试。

如果||太大,则deleteNode函数中可能存在问题,因为在评估position之前您没有测试temp是否为空

调用temp = temp->next;的代码中还有另一个问题:要删除的节点阵列应从最高位置到最低位置进行扫描,否则在删除节点后位置不正确。

以下是经过纠正和简化的版本:

deleteNode