【发布时间】: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