| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1227 人关注过本帖
标题:求指教:两个有序链表合并(功能函数)出现问题!
只看楼主 加入收藏
a4811
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:100
专家分:107
注 册:2012-12-20
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:19 
求指教:两个有序链表合并(功能函数)出现问题!
程序代码:
/*已有a、b两个链表,每个链表中的结点包括学号、成绩。要求
把两个链表合并,按学号升序排列。*/
#include"stdio.h"
#include"stdlib.h"
#define LEN sizeof(Stu)
typedef struct Student
{
    int num;
    float score;
    struct Student *next;
}Stu;
void main()
{
    Stu *Creat();
    Stu *Insert(Stu *ahead,Stu *bhead);
    void Print(Stu *head);
    Stu *ahead,*bhead,*abhead;
    printf("input list a:\n");
    ahead=Creat();
    Print(ahead);
    printf("input list b:\n");
    bhead=Creat();
    Print(bhead);
    printf("The mixed:\n");
    abhead=Insert(ahead,bhead);
    Print(abhead);
}
//建立链表的函数
Stu *Creat()
{
    Stu *p1,*p2,*head;
    p1=p2=(Stu*)malloc(LEN);
    scanf("%d %f",&p1->num,&p1->score);
    head=NULL;
    while(p1->num!=0)
    {
        if(head==NULL)
            head=p1;
        else
            p2->next=p1;
        p2=p1;
        p1=(Stu*)malloc(LEN);
        scanf("%d %f",&p1->num,&p1->score);
    }
    p2->next=NULL;
    return head;
}
//输出链表的函数
void Print(Stu *head)
{
    Stu *p;
    p=head;
    if(head!=NULL)
    {
        while(p!=NULL)//不能写成:p->next!=NULL
        {
            printf("number:%d  score:%5.1f\n",p->num,p->score);
            p=p->next;
        }
    }
}
//合并排序函数
Stu *Insert(Stu *ahead,Stu *bhead)
{
    Stu *pa1,*pa2,*pb1;
    pa1=pa2=ahead;
    pb1=bhead;
    if(ahead==NULL)
        return bhead;
    if(bhead==NULL)
        return ahead;
    do              //让链表b中的结点依次和a中的结点比较并插入
    {
        while((pb1->num>pa1->num)&&(pa1->next!=NULL))
        {
            pa2=pa1;
            pa1=pa1->next;
        }
        if(pb1->num<=pa1->num)
        {
            if(pa1==ahead)
                ahead=pb1;
            else
                pa2->next=pb1;
            pb1->next=pa1;
            pa2=pb1;
            pb1=pb1->next;
        }
    }while(pa1->next!=NULL);
    if(pa1->next==NULL)
        pa1->next=pb1;
    return ahead;
}
/*其它函数都没问题,就是那个合并排序函数有问题。
我希望大家是在我程序的基础上指出问题、帮忙修改,
而不是贴上另一种实现方法的代码。
  不甚感激!!!
*/
搜索更多相关主题的帖子: 排列 
2013-01-04 14:50
yaobao
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:4
帖 子:1854
专家分:4121
注 册:2012-10-25
收藏
得分:18 
楼主原来的两个链表是有序的吗?

认认真真的学习,踏踏实实的走路:戒骄戒躁!!!
2013-01-04 15:15
a4811
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:100
专家分:107
注 册:2012-12-20
收藏
得分:0 
回复 2楼 yaobao
有序的。
2013-01-04 15:18
a4811
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:100
专家分:107
注 册:2012-12-20
收藏
得分:0 
回复 3楼 a4811
在建立链表中,要求输入是按有序输入的。
2013-01-04 15:19
yaobao
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:4
帖 子:1854
专家分:4121
注 册:2012-10-25
收藏
得分:0 
最后的函数实现感觉好乱啊

认认真真的学习,踏踏实实的走路:戒骄戒躁!!!
2013-01-04 15:32
a4811
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:100
专家分:107
注 册:2012-12-20
收藏
得分:0 
回复 5楼 yaobao
就是最后一个函数有问题。
说下我的思路吧,让b链表中的结点依次和a表中的结点比较,每比较一个结点,若符合条件,则将该结点并入a链表,b结点下移。
如果a表结点为NULL时,b表还未至尾部,让b表剩下的结点结到a表后面。
你帮帮我吧,我一直都找不出问题,应该是循环出了问题。

2013-01-04 15:49
yaobao
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:4
帖 子:1854
专家分:4121
注 册:2012-10-25
收藏
得分:0 
我没看懂楼主的代码,但是这样的问题最好用类似分治法的方法来解决

认认真真的学习,踏踏实实的走路:戒骄戒躁!!!
2013-01-04 16:09
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:2 
手机看的,感觉这里有问题,else后面是不是要用{}括起来?
else                pa2->next=pb1;            pb1->next=pa1;            pa2=pb1;            pb1=pb1->next;

总有那身价贱的人给作业贴回复完整的代码
2013-01-04 16:10
a4811
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:100
专家分:107
注 册:2012-12-20
收藏
得分:0 
回复 7楼 yaobao
哥们,我知道你热心肠。
为了表示对你的支持和感谢,我刚在版主投票中投了你一票。
2013-01-04 16:12
yaobao
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:4
帖 子:1854
专家分:4121
注 册:2012-10-25
收藏
得分:0 
感觉楼上说的有道理

认认真真的学习,踏踏实实的走路:戒骄戒躁!!!
2013-01-04 16:12
快速回复:求指教:两个有序链表合并(功能函数)出现问题!
数据加载中...
 
   



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

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