【问题标题】:Nested Merge sort in C not workingC中的嵌套合并排序不起作用
【发布时间】:2014-03-31 06:58:46
【问题描述】:

我有一个链表节点:

typedef struct Record{
  char name[100];
  int branch_id;
  struct Record *next;
}record; 

我想要做的是首先对name 上的链表进行排序,然后将name 排序为branch_id 但它只是在name 上排序.我在这里做错了什么?

record *merge_sort( record * );
record *divide(record *);
record *merge(record *,record *);  

record *merge_sort( record *p )
{
  record *q;
  record *head=p;
  if(p!=NULL && p->next!=NULL){
    q=divide(p);
    p=merge_sort(p);
    q=merge_sort(q);
    head=merge(p,q);
  }
  return head;
}

record *divide(record *p)
{
  record *q,*r;
  q=p;
  r=p->next->next;
  while(r!=NULL){
    r=r->next;
    q=q->next;
    if(r!=NULL){
      r=r->next;
    }
  }
  r=q;
  q=q->next;
  r->next=NULL;
  return q;
}

record *merge(record *p,record *q)
{
  record *head,*tail;
  if(p==NULL || q==NULL){
    printf("Both the sub elements are empty\n");
  }
  if(strcmp(p->name,q->name)<0){
    head=p;
    p=p->next;
  }
  else if((strcmp(p->name,q->name)==0) && (p->branch_id < q->branch_id)){
    head=p;
    p=p->next;
  }
  else if((strcmp(p->name,q->name)==0) && (p->branch_id > q->branch_id)){
    head=q;
    q=q->next;
  }
  else{
    head=q;
    q=q->next; 
  }
  tail=head;
  while(p!=NULL && q!=NULL){
    if(strcmp(p->name,q->name)<0){
      tail->next=p;
      tail=p;
      p=p->next;
    }
    else if((strcmp(p->name,q->name)==0) && (p->branch_id < q->branch_id)){
      tail->next=p;
      tail=p;
      p=p->next;
    }
    else if((strcmp(p->name,q->name)==0) && (p->branch_id > q->branch_id)){
      tail->next=p;
      tail=p;
      p=p->next;
    }
    else{
      tail->next=q;
      tail=q;
      q=q->next;
    }
  }
  if(p!=NULL){
    tail->next=p;
  }
  else{
    tail->next=q;
  }
  return head;
}

【问题讨论】:

    标签: c list sorting data-structures mergesort


    【解决方案1】:

    merge(),特别是在

    while(p!=NULL && q!=NULL){
      if(strcmp(p->name,q->name)<0){
        tail->next=p;
        tail=p;
        p=p->next;
      }
      else if((strcmp(p->name,q->name)==0) && (p->branch_id < q->branch_id)){
        tail->next=p;
        tail=p;
        p=p->next;
      }
      else if((strcmp(p->name,q->name)==0) && (p->branch_id > q->branch_id)){
        tail->next=p;
        tail=p;
        p=p->next;
      }
      else{
        tail->next=q;
        tail=q;
        q=q->next;
      }
    }
    

    第二种和第三种情况的代码相同,将p分配给tail。但是,在循环标头中,我看到对于第三种情况,您分配了q。也许您在复制粘贴循环标头时错过了它?

    我还可以建议您实现一个功能吗?这似乎是一个很好的考虑因素,并且可以防止此错误。

    int reccmp(record *p,record *q){
        int ret = strcmp(p->name,q->name), diff;
    
        if(!ret){
            diff = p->branch_id > q->branch_id;
    
            ret = diff < 0 ? -1 : (diff > 0 ? 1 : 0);
        }
    
        return ret;
    }
    

    【讨论】:

    • 在这里使用比较器功能的好建议。
    • @GrijeshChauhan 我也是。
    猜你喜欢
    • 1970-01-01
    • 2017-08-10
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    • 1970-01-01
    • 1970-01-01
    • 2016-08-19
    相关资源
    最近更新 更多