2 sinat 36204309 sinat_36204309 于 2016.09.24 12:52 提问

使打印出来的排序没有重复的数字,哪位大神帮我改一下,谢谢

#include
#include
typedef struct node
{
int a;
struct node *next;
}*List,list;

List create(int start,int end)
{
List head=(list*)malloc(sizeof(list));
List p=head;
for(int i=start;i<=end;i++){
List t=(list*)malloc(sizeof(list));
t->a=i;
t->next=NULL;
p->next=t;
p=p->next;
}
return head;
}

void print(List head){
List p=head;
while(p){
printf("%3d",p->a);
p=p->next;
}
puts("");
}

List merge(List h1,List h2){
List p=(list*)malloc(sizeof(list));
List r=p;
h1=h1->next;
h2=h2->next;
while(h1 || h2){
if(h1==NULL){
p->next=h2;
p=p->next;
h2=h2->next;
continue;
}

if(h2==NULL){
   p->next=h1;
   p=p->next;
   h1=h1->next;
   continue;
}

if(h1->a>h2->a){
   p->next=h2;
   p=p->next;
   h2=h2->next;
}
else {
   p->next=h1;
   p=p->next;
   h1=h1->next;
}
}
return r;

}
int main(){
List h1=create(5,10);
List h2=create(10,15);
List h=merge(h1,h2);
print(h);
return 0;
}

2个回答

leewers
leewers   2016.09.24 14:09
已采纳
 if(h1->a>h2->a){
       p->next=h2;
       p=p->next;
       h2=h2->next;
    }
    else if(h1->a < h2->a){
       p->next=h1;
       p=p->next;
       h1=h1->next;
    }
    else{
        p->next=h2;
        p=p->next;
        h2=h2->next; //反正两个链表头元素相等,随便加入一个
        h1 = h1->next;//将另外一个无视掉就可以了
    }

另外在print(h)之前最好加上h = h->next;因为按照你的写法,链表h的头元素其实是多余的

sinat_36204309
sinat_36204309 你知道怎么用线性表实现这个功能吗
大约一年之前 回复
leewers
leewers   2016.09.24 18:05

之前的回答忘记考虑了一点,就是旧链表中本身就有相同的元素,比如h1: 8 8 8 8 8, h2: 5 6 7 8 9,按原来的写法就会打出5 6 7 8 8 8 8 8 8 9,
后面改了一下,应该没问题了

if(h1->a>h2->a){
    if(p->a != h2->a){//当即将加入链表p的元素与链表p末尾的元素相同时,无视掉,以免出现打印相同元素 
        p->next=h2;
        p=p->next;
    }
    h2=h2->next;
}
else if(h1->a < h2->a){
    if(p->a != h1->a){//同上
        p->next=h1;
        p=p->next;
    }
    h1=h1->next;
}
else{
    if(p->a != h2->a){//同上
        p->next=h2;
        p=p->next;
    }
    h2=h2->next;
    h1 = h1->next;
}

Csdn user default icon
上传中...
上传图片
插入图片