计算C中链表中的冗余

时间:2020-01-04 20:29:11

标签: c struct linked-list

我正在练习可以在链表中查找冗余的代码。 例如:

输入

777

输出

包含2个冗余

输入

32182

输出

包含1个冗余

我正在努力在代码中实际跟踪冗余。我对链表进行了排序,然后假设我将创建2个指针,它们将遍历链表的当前位置,并且将遍历链表的先前位置,如果它们等于count ++。但是我总是得到0个冗余。

在下面的代码中,我认为我的挑战主要在于countRedun()方法。


struct digit * insertAtFront(struct digit *start, struct digit * newDig){
    struct digit * ptr = start;
    newDig = start;
    return newDig;

}
struct digit * insertIntoSorted(struct digit *start, struct digit *newDig) {
    struct digit *ptr = start;
    struct digit *prev = NULL;
    while ((ptr!=NULL) && (ptr->num < newDig->num)) {
        prev = ptr;
        ptr = ptr->next;
    }
    if (prev == NULL) {
        start = insertAtFront(start, newDig);
    } else {
        prev->next = newDig;
        newDig->next = ptr;
    }
    return(start);
}

struct digit * sortedCopy(struct digit * start) {
    //! heap1=showMemory(start=348, cursors=[start, ptr, sortedStart, newDigit])
    //! heap2=showMemory(start=519, cursors=[start, newDigit, ptr, prev])
    struct digit *ptr = start;
    struct digit *sortedStart = NULL;
    struct digit *newDigit;

    if (start!=NULL) {
        sortedStart = createDigit(start->num);
        ptr = ptr->next;
    }
    while (ptr!=NULL) {
        newDigit = createDigit(ptr->num);
        sortedStart = insertIntoSorted(sortedStart, newDigit);
        ptr = ptr->next;
    }
    return(sortedStart);
}

int countRedun(struct digit * start){
    struct digit  *sorted, *ptr, *prev, * curr;
    ptr = start;
    prev = start;


    //sort linked list
    sorted = sortedCopy(start);
    int count = 0;

    while(ptr != NULL)
    {

        if(ptr->num == prev->num)
        {
        count++;
        }
    prev = ptr;
    ptr = ptr->next;
    }

}

假设问题的关键在于排序和计数方法,我已经排除了要求用户输入的代码以及链接列表创建者方法。

3 个答案:

答案 0 :(得分:2)

我认为问题出在HtmlWebViewSource

WebView

请记住,一切都是通过值传递的。您的<WebView x:Name="yourWebView" Source="{Binding HtmlSource}" WidthRequest="1000" HeightRequest="1000" /> 变量根本没有使用,在此函数中insertAtFrontstruct digit * insertAtFront(struct digit *start, struct digit * newDig){ struct digit * ptr = start; newDig = start; return newDig; } 是局部变量。真的等价于:

ptr

再看看该功能。我不确定您的上下文,但是您可以使用调试器或printf语句查看发生了什么。

答案 1 :(得分:2)

看来sortedCopy构成了一个完整的新列表,但已排序。如果是这样,那么您需要重新排序:

process.exit()

具有:

ptr = start;
prev = start;


//sort linked list
sorted = sortedCopy(start);

作为注释,您可能会更好:

//sort linked list
sorted = sortedCopy(start);
ptr = sorted;
prev = sorted;

否则,您的计数始终将减一。

答案 2 :(得分:2)

如果您确定:

  • 您需要做的就是获取冗余数量
  • 您的输入将始终是09之间的数字

然后,您无需对数据进行排序(顺便说一句,您正在以O(n ^ 2)的时间复杂度进行操作)。

您需要做的就是保留一个数组,其中包含10个初始化为0的元素,增加元素的相应索引并计算值大于1的元素。

与此类似的东西(请注意:未经测试):

int countRedun(struct digit * start){
    int counter[10] = {0};
    struct digit *ptr = start;
    int total = 0;

    while(ptr != NULL)
    {
        counter[ptr->num]++;
        ptr = ptr->next;
    }

    for (int i = 0; i < 10; i++) {
        if (counter[i] > 1) {
            total += counter[i] - 1;
        }
    }
    return total;
}
相关问题