链接的链接功能不会按预期将最大项目放在列表的末尾

时间:2016-10-01 18:18:09

标签: c linked-list

我有一个链表,我必须确保无论列表的最大数量是什么,我都把它放在链表的末尾。我不确定我做错了什么。有人可以解释一下吗?

void moveAllMaxAtEnd(list A) {
    int max=0;
    link tmp=A->first;
    link curr=tmp->next;
    int i,count=0;
    while(curr!=NULL){          //This first while is where I find the max item
        if(curr->item>=max){
            max=curr->item;
            count++;
        }
        else{
            curr=curr->next;
        }
     }
     link prev=A->first;
     link curr1=prev->next;
     link tmp1;
     while(curr1->next!=NULL){   //In this loop I am trying to put the 
         if(curr1->item==max){   //max items at the end.
            prev->next=curr1->next;
            tmp1=prev->next;
            prev->next=curr1->next;
            curr1->next=tmp1;
         }
         else{
             prev=prev->next;
             curr1=curr1->next;
         }
     }

}

2 个答案:

答案 0 :(得分:0)

虽然我还没有对它进行过测试,但这应该可行。如果是它的作业,请今天不要阅读答案(从自己身上学习会对你有所帮助!)。

对列表元素进行一点绘制并查看链接行为。您将立即看到此方法的问题。

我的绘图示例

list drawing

更正(不要立即阅读)

var peoples = [
  { "attr1": "bob", "attr2": "pizza" },
  { "attr1": "john", "attr2": "sushi" },
  { "attr1": "larry", "attr2": "hummus" }
];

var index = peoples.map(function(o) { return o.attr1; }).indexOf("john");
console.log("index of 'john': " + index);

var index = peoples.map((o) => o.attr1).indexOf("larry");
console.log("index of 'larry': " + index);

var index = peoples.map(function(o) { return o.attr1; }).indexOf("fred");
console.log("index of 'fred': " + index);

var index = peoples.map((o) => o.attr2).indexOf("pizza");
console.log("index of 'pizza' in 'attr2': " + index);

答案 1 :(得分:0)

问题(1)

link tmp=A->first;
link curr=tmp->next;
int i,count=0;
while(curr!=NULL){          //This first while is where I find the max item
    if(curr->item>=max){
        max=curr->item;

排除第一个元素。 (如果第一个元素是假人,没问题。)

问题(2)

prev->next=curr1->next;//curr1 cut off
tmp1=prev->next;
prev->next=curr1->next;//Processing is a duplicate. meaningless.
curr1->next=tmp1;//==> curr1->next= prev->next ==> curr1->next= curr1->next;meaningless.

不存在具体流程。

修复如下: (注意:第一个元素是处理,如果它不是虚拟的。改变很容易)

void moveAllMaxAtEnd(list A){
    if(!A || !A->first || !A->first->next)
        return;

    link prev = A->first;
    link curr = prev->next;
    int max = prev->item;

    while(curr != NULL){//This first while is where I find the max item
        if(curr->item >= max){
            max = curr->item;
        }
        prev = curr;
        curr = curr->next;
    }
    link last = prev;

    prev = NULL;
    curr = A->first;
    link max_list = NULL;

    while(curr->next != NULL){
        if(curr->item == max){
            link cut = curr;
            curr = curr->next;
            if(prev){
                prev->next = cut->next;
            } else {
                A->first = cut->next;
            }
            cut->next = max_list;
            max_list = cut;
        } else {
            prev = curr;
            curr = curr->next;
        }
    }
    last->next = max_list;
}