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 你知道怎么用线性表实现这个功能吗
接近 2 年之前 回复
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
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
菜单程序,c
里面有许多错误,希望大神帮我改一下,十分感谢,拜托了。。有没有哪位大神愿意的
Windows多线程按顺序打印ABC
#include #include #include const int NUM = 3; int nCount = 0; HANDLE g_Mutex = NULL; HANDLE g_Event = NULL; unsigned int WINAPI ThreadProc(LPVOID lParam) { int nParam = (int)lParam; char c = '
哪位大神帮我注释一下,万分感谢
①设计&amp;lt;%@ Page Language=&quot;C#&quot; AutoEventWireup=&quot;true&quot; CodeFile=&quot;Login.aspx.cs&quot; Inherits=&quot;Login&quot; %&amp;gt; &amp;lt;%@ Register Src=&quot;UserControl/top.ascx&quot; TagName=&quot;top&quot; TagPrefix=&quot;uc2&quot; %
作业-创建数组随机生成30个不重复数字进去-在随机出来5个-然后排序输出
Document var arr = new Array(); while(arr.length != 30){ var Randoms = Math.floor(Math.random()*(60-0+1)+0); arr.push(Randoms); //随
哪位哥哥帮我改一下JS计算
求大神哥哥帮我改一下JS代码计算. 改成radio点击控制事件.效果如下面2张图 点击乘就以*计算方式。 点击减就以-计算方式。 代码: 小学学费管理 function SumNum() { var sumValue A=document.getElementById('y1').value; As=document.getElementById('ch
抽奖程序源码
这是一个抽奖程序的源码,我刚学,实在是改不明白了。能不能帮我改一下,谢谢。
现阶段实践“拿着锤子找钉子”的六个步骤
注:3月8日晚,咱们饭团“AI产品经理大本营”举行了第2期微信群分享活动;本文干货总结,来自四位分享嘉宾中的第一位,@郭靖。【嘉宾介绍】@郭靖:前迅雷、乐逗市场/产品,现创业者,曾获大数据BOT大赛冠军。公司曾开发选车聊天机器人,汽车维修门店智能助理,对话信息车险反欺诈。曾入选硅谷Draper University创业营,4个月英语从0学到能辩论并自学tensorflow至可写主流CNN。是咱们饭
【LintCode】删除排序数组中的重复数字
删除排序数组中的重复数字  描述: 给定一个排序数组,在原数组中删除重复出现的数字,使得每个元素只出现一次,并且返回新的数组的长度。 不要使用额外的数组空间,必须在原地没有额外空间的条件下完成。 样例 给出数组A =[1,1,2],你的函数应该返回长度2,此时A=[1,2]。 思路:因为不让使用额外数组空间,所以只能从原来
容易 删除排序数组中的重复数字
Remove Duplicates from Sorted Array -- LeetCode 分类: LeetCode2014-02-27 05:12 4789人阅读 评论(5) 收藏 举报 leetcodejava面试链表数据结构 原题链接: http://oj.leetcode.com/problems/remove-duplicates-from-sorted-arr
打印出给定字符串中字符的所有不重复排列
打印出给定字符串中字符的所有不重复排列