C中链表的冗余计数

标签 c struct linked-list

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

输入

777

输出

contains 2 redundancies

输入

32182

输出

contains 1 redundancies

我正在努力实际跟踪代码中的冗余。我对链表进行了排序,然后我假设我只创建 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;
    }

}

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

最佳答案

看起来sortedCopy创建了一个全新的列表,但是已经排序了。如果是这样,那么您需要重新排序:

ptr = start;
prev = start;


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

与:

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

请注意,您可能最好:

 prev = NULL;
 while(ptr != NULL) {
    count += (prev && ptr->num == prev->num);
    prev = ptr;
    ptr = ptr->next;
}

否则你数的总是会少一。

关于C中链表的冗余计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59594570/

相关文章:

java - 链表的冒泡排序实现

java - LinkedList 超出内存限制

c - 从文件中读取并使用指针将数据放入动态结构中

c++ - 为什么我的链接列表在函数调用后被删除?

c - 遍历结构数组

c - 数组的最大值的最大值

指向不完整类型的循环结构指针

c - 解析为一个结构

c - 使用 glutWireCube() 用鼠标拖动对象

c - 用C读取300MB文本文件