标题:【链表问题】我找了很久都找不到哪里错,求大神指教
只看楼主
奶牛君
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2015-12-20
结帖率:100%
已结贴  问题点数:20 回复次数:5 
【链表问题】我找了很久都找不到哪里错,求大神指教
【题目】已知有两个链表a和b,结点类型相同,均包括一个int类型的数据。编程把两个链表合并成一个,结点按升序排列。

#include "stdio.h"
#include "malloc.h"
#define LEN sizeof(struct DATA)

struct DATA
{
     long num;
     struct DATA *next;
};

struct DATA *create(int n)
{
     struct DATA *head=NULL,*p1=NULL,*p2=NULL;
     int i;
     for(i=1;i<=n;i++)
     {  p1=(struct DATA *)malloc(LEN);
        scanf("%ld",&p1->num);
        p1->next=NULL;
        if(i==1) head=p1;
        else p2->next=p1;
        p2=p1;
      }
      return(head);
}

struct DATA *merge(struct DATA *head, struct DATA *head2)
{
    struct DATA *p;
    p=head;
    while(p->next!=NULL)
    {
        p=p->next;
    }
    p->next=head2;
      return head;
}

struct DATA *insert(struct DATA *head, struct DATA *d)
{
    struct DATA *p,*p1,*p2;
    p1=head;
    p=d;
    if(head=NULL)
    {
        head=p;
        p->next=NULL;
    }
    else
    {
        while((p1->next!=NULL)&&(p->num>p1->num))
        {
          p1=p;
          p=p->next;
        }
        if(p->num<=p1->num)
        {
            if(head=p1)
            head=p;
            else
            p2->next=p;
            p->next=p1;
        }
        else
        {
            p1->next=p;
            p->next=NULL;
        }
    }
    return head;
}

struct DATA *sort(struct DATA *head)
{
    struct DATA *p,*q;
    p=head;
    q=head;
    q=q->next;
    p->next=NULL;
    p=q;
    while(q->next!=NULL)
    {
        q=q->next;
        p->next=NULL;
        head=insert(head,p);
        p=q;
    }
    head=insert(head,p);
    return head;
}

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

main()
{
    struct DATA *head, *head2;
    int n;
    long del_num;
    scanf("%d",&n);
    head=create(n);
    scanf("%d",&n);
    head2=create(n);
    head = merge(head, head2);
    head = sort(head);
    print(head);
}
搜索更多相关主题的帖子: include create 
2015-12-20 10:41
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1728
专家分:3216
注 册:2015-12-2
得分:1 
这个问题很有指导意义!帮顶一个!
2015-12-20 17:37
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
得分:1 
哪里错了呢?编译错、运行错、结果错?大神们看到这么多代码是不愿帮你不明就里地调试的。

能编个毛线衣吗?
2015-12-20 19:25
未来大仙
Rank: 6Rank: 6
来 自:黑窟窿
等 级:侠之大者
威 望:4
帖 子:263
专家分:491
注 册:2015-6-20
得分:1 
回复 3楼 wmf2014
他说滴对!太长了,又不说哪里有问题,很少人帮你看的

好好学习,天天向上!
2015-12-20 19:42
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
得分:1 
刚看第一个函数就有问题,也就没心情往下看了。重学malloc函数的用法。

重剑无锋,大巧不工
2015-12-20 19:53
wengbin
Rank: 10Rank: 10Rank: 10
来 自:陕西西安
等 级:贵宾
威 望:19
帖 子:370
专家分:1846
注 册:2015-5-8
得分:16 
插入函数写的是一团糟,逻辑错误就在那里面了,其他的没细看。
程序代码:
struct DATA *insert(struct DATA *head, struct DATA *d)
{
    struct DATA *p,*p1,*p2;
    p1=head;//这是指向原链表吧
    p=d;//这是指向待插入节点
    if(head=NULL)//这种错就别犯了吧,if(head==NULL)
    {
        head=p;
        p->next=NULL;
    }
    else
    {
        while((p1->next!=NULL)&&(p->num>p1->num))//待插入节点的num大于原链表中节点的num且节点不是尾节点时
        {
          p1=p;//将p1指向待插入节点,这是想干嘛?
          p=p->next;//这又是要干嘛?
          //猜想你这时是想什么也不做,判断下链表下一节点与待插入节点的大小吧,那么这时应该是:p2=p1;p1=p1->next;加“p2=p1”这句是为了之后的插入做准备
        }
        if(p->num<=p1->num)//待插入节点小于等于链表中节点,开始插入
        {
            if(head=p1)//这是啥?应该是if(p1==head)
            head=p;//这就完了嘛?没连接起来呀大哥,改为:p2=p1=head;head=p;head->next=p1;
            else
            p2->next=p;//p2指向哪里的?
            p->next=p1;//这两行改为:p2->next=p;p->next=p1;
        }
        else
        {
            p1->next=p;
            p->next=NULL;
        }
    }
    return head;
}

最后,给个我测试通过的代码,其他部分已经删了,只保留以上分析的部分:
程序代码:
#include "stdio.h"
#include "malloc.h"
#define LEN sizeof(struct DATA)
#define NULL 0
typedef struct DATA
{
     long num;
     struct DATA *next;
}DATA;

struct DATA *create(int n)
{
     struct DATA *head=NULL,*p1=NULL,*p2=NULL;
     int i;
     for(i=0;i<n;i++)
     {
        p1=(struct DATA *)malloc(LEN);
        scanf("%ld",&p1->num);
        p1->next=NULL;
        if(i==0) head=p1;
        else p2->next=p1;
        p2=p1;
      }
      return(head);
}
struct DATA *insert(struct DATA *head, struct DATA *d)
{
    struct DATA *p,*p1,*p2;
    p1=head;
    p=d;
    if(head==NULL)
    {
        head=p;
        p->next=NULL;
    }
    else
    {
        while((p1->next!=NULL)&&(p->num>p1->num))
        {
            p2=p1;p1=p1->next;
        }
        if(p->num<=p1->num)
        {
            if(p1==head)
            {
               p2=p1=head;
               head=p;
               head->next=p1;
            }

            else
            {
                p2->next=p;
                p->next=p1;
            }

        }
        else
        {
            p1->next=p;
            p->next=NULL;
        }
    }
    return head;
}
void print(struct DATA *head)
{
    struct DATA *p;
    p=head;
    while(p!=NULL)
    {
        printf("%ld\t",p->num);
        p=p->next;
    }
    printf("\n");
}

int main()
{
    DATA* head, *d;
    DATA Q;
    d=&Q;
    Q.next=0;
    Q.num=2;
    head=create(3);
    print(head);
    head=insert(head,d);
    print(head);
    return 0;
}


[此贴子已经被作者于2015-12-22 11:07编辑过]

2015-12-22 10:58



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-460404-1-1.html




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

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