| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 844 人关注过本帖
标题:两个单链表头尾相接不成功的问题,应该是低级错误,谢谢
只看楼主 加入收藏
colinxt
Rank: 2
等 级:论坛游民
帖 子:34
专家分:10
注 册:2010-4-5
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:8 
两个单链表头尾相接不成功的问题,应该是低级错误,谢谢
想实现两个单链表电话本,先查找并删除重复项,然后头尾连接,总是失败,帮忙看下,谢谢
程序代码:
void combine(node *head1, node *head2)  //合并
{
    node *p1, *p2, *pre1 = NULL, *pre2 = NULL;  //pre指向前驱结点
    if (!head1 && !head2)
    {
        puts("两个电话本都是空的,合不了");
    }
    else
    {
        p1 = head1;
        p2 = head2;
        while (p1)
        {
            while (p2)
            {
                while ((strcmp(p2->item.name,p1->item.name) != 0) || (p2->item.number != p1->item.number))
                {
                    pre2 = p2;
                    p2 = p2->next;
                }
                if (p2->next)
                {
                    if (!pre2)
                    {
                        p2 = p2->next;
                        head2 = head2->next;
                    }
                    else
                    {
                        pre2->next = p2->next;
                    }
                }
                else
                {
                    p2 = head2;
                }
            }
            p2 = head2;
            pre1 = p1;
            p1 = p1->next;
        }
        pre1->next = head2;
        p1 = head1;
        display(p1);  //打印
    }
}

搜索更多相关主题的帖子: 低级错误 头尾 单链 相接 
2010-05-30 18:52
colinxt
Rank: 2
等 级:论坛游民
帖 子:34
专家分:10
注 册:2010-4-5
收藏
得分:0 
自己顶
2010-05-31 13:27
韩明海
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:253
专家分:749
注 册:2010-4-3
收藏
得分:0 
你的逻辑很不好,自己在好好分析一下吧,明天帮你改一下
2010-05-31 20:38
hanzhenddd
Rank: 5Rank: 5
等 级:职业侠客
帖 子:90
专家分:361
注 册:2010-3-4
收藏
得分:0 
给你个伪代码
typedef struct *NODE;
typedef NODE ST;
delete(ST p, int x)  //p为链表首地址,X为删除内容
{
     ST tmp;
     p = find_prev (tmp, x) //find 函数自己写,查找X的前驱单元.
     tmp =p->next;
     p->next = tmp->next;
    free(tmp);
}


[ 本帖最后由 hanzhenddd 于 2010-5-31 23:44 编辑 ]
2010-05-31 23:37
韩明海
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:253
专家分:749
注 册:2010-4-3
收藏
得分:20 
int combine(node *head1, node *head2)  //合并
{
    node *p1, *p2, *pre1 = NULL, *pre2 = NULL;  //pre指向前驱结点
    if (!head1 || !head2)
    {
        if (!head1 || !head2)
        {
            puts("两个电话本都是空的,合不了");
            return 0;
        }
        else if(head2==NULL)
        {
            head2=head1;
        }
    }
    else
    {
        p1 = head1;
        p2 = head2;
        while (p1)
        {
            while (p2)
            {
                if((strcmp(p2->item.name,p1->item.name) != 0) || (p2->item.number != p1->item.number))
                {
                    pre2 = p2;
                    p2 = p2->next;
                }
                else if(p1==head1)
                {
                    p1=head1=head1->next;
                }
                else
                {
                    pre1->next=p1->next;
                    p1=p1->next;
                    p2=head2;
                }
            }
            p1=p1->next;
            p2=head2;
        }
        pre2->next=head1;      
    }
    display(head2);  //打印
}
2010-06-01 14:10
colinxt
Rank: 2
等 级:论坛游民
帖 子:34
专家分:10
注 册:2010-4-5
收藏
得分:0 
回复 5楼 韩明海
谢谢。。不过放到主程序里面仍然不行。。提示电话本是空的。。
要不你稍微解释一下你写的这段代码吧。。我看看是不是哪里可以改改
2010-06-01 16:54
韩明海
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:253
专家分:749
注 册:2010-4-3
收藏
得分:0 
如果两个都是空的,直接输出提示然后退出子函数,如果有一个是空的,就保证head2指向不是空的链表,这就是第一个if要做的,
你把if的判断方式改一下,而且确定链表不是空的,
后面的思想是把p1的元素和p2的每个元素比较,如果有相同的就把p1的这个元素删掉,p1的下一个元素再从头和p2的每个元素比较,这样把p1的每个元素比较以后,p1和p2就没有相同的元素了,在把p1连接到p2后面
2010-06-02 12:37
kettle99
Rank: 2
等 级:论坛游民
帖 子:52
专家分:54
注 册:2010-5-25
收藏
得分:0 
我是菜鸟,我来个删除链表P2中结点的,不知道能行不?大侠指点

int combine(node *head1, node *head2)  //合并
{
    node *p1, *p2, *pre1 = NULL, *pre2 = NULL;  //pre指向前驱结点
    if (!head1 || !head2)
    {
        if (!head1 || !head2)
        {
            puts("两个电话本都是空的,合不了");
            return 0;
        }
        else if(head2==NULL)
        {
            head2=head1;
        }
    }
    else
    {
        p1 = head1;
        p2 = head2;
        while (p1)
        {
            while (p2)
            {
                if((strcmp(p2->item.name,p1->item.name) != 0) || (p2->item.number != p1->item.number))  //若非重复结点,P2指向下一结点。
                {
                    pre2 = p2;
                    p2 = p2->next;
                }
                else                               //若是重复结点,删除当前结点P2
                {
                    pre2->next=p2->next;
                    p2=p2->next;
                }

            }
            p1=p1->next;
            p2=head2;
        }
        pre2->next=head1;      
    }
    display(head2);  //打印
}
2010-06-02 22:25
韩明海
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:253
专家分:749
注 册:2010-4-3
收藏
得分:0 
感觉也可以,但是不知道你看懂我的没有,我删除节点可不是想你那样删的,如果是第一个节点是重复的呢,这时你的pre2是空的,pre2->next是没有意义的,做链表,头结点一定要特殊考虑
2010-06-03 12:47
快速回复:两个单链表头尾相接不成功的问题,应该是低级错误,谢谢
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.057620 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved