| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1469 人关注过本帖
标题:链表合并问题,没有报错,但运行时有些数据可以有些不可以,找不到哪里出错 ...
只看楼主 加入收藏
张珂珂
Rank: 2
来 自:山东
等 级:论坛游民
帖 子:60
专家分:30
注 册:2019-11-3
结帖率:100%
收藏
已结贴  问题点数:30 回复次数:2 
链表合并问题,没有报错,但运行时有些数据可以有些不可以,找不到哪里出错了
程序代码:
//已有a,b两个链表,每个链表中的结点包括学号、成绩。要求把两个链表合并,按学号升序排序。
#include<stdio.h>
#include<malloc.h>
#define LEN sizeof(struct student)

typedef struct student
{
    int num;
    int score;
    struct student *next;
}stu;

void print(stu *head);
void insert(stu *head,stu *p);
stu *creat();
void clear(stu *head);
stu *combine(stu *ahead,stu *bhead);

void main()
{
    stu *ahead,*bhead;
    printf("input list a:\n");
    ahead=creat();          //建立链表a
    printf("List a:\n");
    print(ahead);
    printf("\n\ninput list b:\n");
    bhead=creat();
    printf("List b:\n");    //建立链表b
    print(bhead);
    ahead=combine(ahead,bhead);  //合并链表
    printf("\n\nList:\n");
    print(ahead);
    clear(ahead);     //清除
}

stu *creat()
{
    stu *p,*head;
    head=(stu *)malloc(LEN);    //建立头结点
    head->next=NULL;
    printf("input number,score:\n");
    p=(stu *)malloc(LEN);    //建立数据节点
    scanf("%d %d",&p->num,&p->score);  //输入数据
    while(p->num!=0)
    {
        insert(head,p);    //按顺序输入
        p=(stu *)malloc(LEN);
        scanf("%d %d",&p->num,&p->score);
    }
    free(p);
    return(head);
}

void insert(stu *head,stu *p)
{
    stu *p0,*p1,*p2;
    p2=head;
    p1=head->next;
    p0=p;
    while(p1!=NULL)
    {
        if(p0->num>p1->num)   //让p0在p1和p2之间
        {
            p2=p1;
            p1=p1->next;     //p1后移
        }
        else break;
    }
    p0->next=p1;     //p0,p1链接
    p2->next=p0;     //p2,p0链接
}

stu *combine(stu *ahead,stu *bhead)
{
    stu *pa1,*pa2,*pb1,*pb2;
    pa2=ahead;
    pa1=ahead->next;
    pb2=pb1=bhead->next;   //头结点用不到
    while(pb1&&pa1->next!=NULL)
    {
        while((pb1->num>pa1->num)&&(pa1->next!=NULL))
        {
            pa2=pa1;        //往后移
            pa1=pa1->next;  //后移
        }
        if(pb1->num<=pa1->num)
        {
            pa2->next=pb1;
            pb2->next=pa1;     //节点连接
            pb1=pb1->next;    //第二个链表后移
            pa2=pb2;          //pa1移动
            pb2=pb1;          //pb2后移
        }
    }
    if(pb1)       //非空已指向链表b尾
        pa1->next=pb1;    //b链表剩下的接到a链表后边
    free(bhead);
    return(ahead);
}

void print(stu *head)
{
    stu *p;
    p=head->next;
    while(p!=NULL)
    {
        printf("%d %d\n",p->num,p->score);
        p=p->next;
    }
}

void clear(stu *head)
{
    stu *p;
    p=head->next;
    while(p!=NULL)
    {
        head->next=p->next;
        free(p);
        p=head->next;
    }
    free(head);
}

图片附件: 游客没有浏览图片的权限,请 登录注册

图片附件: 游客没有浏览图片的权限,请 登录注册

图片附件: 游客没有浏览图片的权限,请 登录注册


[此贴子已经被作者于2020-5-18 23:46编辑过]

搜索更多相关主题的帖子: head num next stu 链表 
2020-05-18 23:30
fulltimelink
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:7
帖 子:171
专家分:752
注 册:2020-4-1
收藏
得分:30 
先让pb1指向b链表的下一个,再改动pb2指向a链表
如果先改pb2,  pb1->next就移动到a链表去了
pb1 = pb1->next;
pb2->next = pa1;


程序代码:
#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>
#include<malloc.h>
#define LEN sizeof(struct student)

typedef struct student
{
    int num;
    int score;
    struct student *next;
}stu;

void print(stu *head);
void insert(stu *head, stu *p);
stu *creat();
void clear(stu *head);
stu *combine(stu *ahead, stu *bhead);

void main()
{
    stu *ahead, *bhead;
    printf("input list a:\n");
    ahead = creat();          //建立链表a
    printf("List a:\n");
    print(ahead);
    printf("\n\ninput list b:\n");
    bhead = creat();
    printf("List b:\n");    //建立链表b
    print(bhead);
    ahead = combine(ahead, bhead);  //合并链表
    printf("\n\nList:\n");
    print(ahead);
    clear(ahead);     //清除
}

stu *creat()
{
    stu *p, *head;
    head = (stu *)malloc(LEN);    //建立头结点
    head->next = NULL;
    printf("input number,score:\n");
    p = (stu *)malloc(LEN);    //建立数据节点
    scanf("%d %d", &p->num, &p->score);  //输入数据
    p->next = NULL;
    while (p->num != 0)
    {
        insert(head, p);    //按顺序输入
        p = (stu *)malloc(LEN);
        scanf("%d %d", &p->num, &p->score);
    }
    free(p);
    return(head);
}

void insert(stu *head, stu *p)
{
    stu *p0, *p1, *p2;
    p2 = head;
    p1 = head->next;
    p0 = p;
    while (p1 != NULL)
    {
        if (p0->num > p1->num)   //让p0在p1和p2之间
        {
            p2 = p1;
            p1 = p1->next;     //p1后移
        }
        else break;
    }
    p0->next = p1;     //p0,p1链接
    p2->next = p0;     //p2,p0链接
}

stu *combine(stu *ahead, stu *bhead)
{
    stu *pa1, *pa2, *pb1, *pb2;
    pa2 = ahead;
    pa1 = ahead->next;
    pb2 = pb1 = bhead->next;   //头结点用不到
    while (pb1&&pa1->next != NULL)
    {
        while ((pb1->num > pa1->num) && (pa1->next != NULL))
        {
            pa2 = pa1;        //往后移
            pa1 = pa1->next;  //后移
        }
        if (pb1->num <= pa1->num)
        {
            pa2->next = pb1;
            pb1 = pb1->next;
            pb2->next = pa1;     //节点连接
                //第二个链表后移
            pa2 = pb2;          //pa1移动
            pb2 = pb1;          //pb2后移
        }
    }
    if (pb1)       //非空已指向链表b尾
        pa1->next = pb1;    //b链表剩下的接到a链表后边
    free(bhead);
    return(ahead);
}

void print(stu *head)
{
    stu *p;
    p = head->next;
    while (p != NULL)
    {
        printf("%d %d\n", p->num, p->score);
        p = p->next;
    }
}

void clear(stu *head)
{
    stu *p;
    p = head->next;
    while (p != NULL)
    {
        head->next = p->next;
        free(p);
        p = head->next;
    }
    free(head);
}
2020-05-19 08:38
张珂珂
Rank: 2
来 自:山东
等 级:论坛游民
帖 子:60
专家分:30
注 册:2019-11-3
收藏
得分:0 
回复 2楼 fulltimelink
明白了,谢谢!

长风吹过
2020-05-19 08:53
快速回复:链表合并问题,没有报错,但运行时有些数据可以有些不可以,找不到哪里 ...
数据加载中...
 
   



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

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