标题:一个链表的值 赋值给 另一个链表,但是失败
只看楼主
yanzy
Rank: 5Rank: 5
等 级:职业侠客
威 望:2
帖 子:104
专家分:372
注 册:2017-2-7
结帖率:100%
已结贴  问题点数:50 回复次数:23 
一个链表的值 赋值给 另一个链表,但是失败
L1链表的值L1->Data赋值到一个新的内存空间p->Data,但是失败了,不懂为啥?
如下图


源代码如下
程序代码:
#include <stdio.h>
#include <stdlib.h>

typedef int ElementType;
typedef struct Node *PtrToNode;
struct Node
{
    ElementType Data;
    PtrToNode   Next;
};
typedef PtrToNode List;

List Read(); /* 细节在此不表 */
void Print( List L ); /* 细节在此不表;空链表将输出NULL */

List Merge( List L1, List L2 );

int main()
{
    List L1, L2, L;
    L1 = Read();
    L2 = Read();
    L = Merge(L1, L2);
    Print(L);
    Print(L1);
    Print(L2);
    return 0;
}

/* 你的代码将被嵌在这里 */
List Read()
{
    PtrToNode first = NULL;

    int n;
    printf("Enter a series of integers (0 to terminate): ");
    scanf("%d", &n);
    if (n == 0)
        return first;
    PtrToNode new_node = malloc(sizeof(struct Node));
    if (new_node == NULL)
    {
        printf("Error: malloc failed in add to list\n");
        exit(0);
    }

    new_node->Data = n;
    new_node->Next = first;
    first = new_node;

    for (;;)
    {
        printf("Enter a series of integers (0 to terminate): ");
        scanf("%d", &n);
        if (n == 0)
            return first;
        PtrToNode new_node = malloc(sizeof(struct Node));
        if (new_node == NULL)
        {
            printf("Error: malloc failed in add to list\n");
            exit(0);
        }

        new_node->Data = n;

        for (PtrToNode p1 = first, p2 = NULL; ; p2 = p1, p1 = p1->Next)
        {
            if (p2 == NULL &&new_node->Data <= p1->Data)
            {
                new_node->Next = p1;
                first = new_node;
                break;
            }
            if (new_node->Data<=p1->Data && new_node->Data>p2->Data)
            {
                new_node->Next = p1;
                p2->Next = new_node;
                break;
            }
            if(p1->Next==NULL&& new_node->Data>p1->Data)
            {
                new_node->Next = p1->Next;
                p1->Next = new_node;
                break;
            }
        }
    }
}

void Print(List L)
{
    if (L == NULL)
        printf("NULL\n");
    else
    {
        for (; L != NULL; L = L->Next)
            printf("%d ", L ->Data);
        printf("\n");
    }
}

List Merge(List L1, List L2)
{
    PtrToNode first = NULL;
    PtrToNode t;
    PtrToNode p = malloc(sizeof(struct Node));
    if (p == NULL)
    {
        printf("Error: malloc failed in add to list\n");
        exit(0);
    }
    p->Next = first;
    first = p;
    for (;; )
    {
        if (L1 != NULL&&L2 != NULL)
            if (L1->Data < L2->Data)
            {
                p->Data = L1->Data; //         问题出在这种地方
                t = L1;
                L1 = L1->Next;
                free(t);
                t = p;
            }
            else
            {
                p->Data = L2->Data;
                t = L2;
                L2 = L2->Next;
                free(t);
                t = p;
            }
        if (L1 == NULL&&L2 != NULL)
        {
                p->Data = L2->Data;
                t = L2;
                L2 = L2->Next;
                free(t);
                t = p;
        }
        if (L2 == NULL&&L1 != NULL)
        {
            p->Data = L1->Data;
            t = L1;
            L1 = L1->Next;
            free(t);
            t = p;
        }
        
        if (L1 == NULL && L2 == NULL)
        {
            p->Next = NULL;
            return first;
        }

        PtrToNode p = malloc(sizeof(struct Node));
        if (p == NULL)
        {
            printf("Error: malloc failed in add to list\n");
            exit(0);
        }
        t->Next = p;
    }
}


[此贴子已经被作者于2017-9-19 21:08编辑过]

搜索更多相关主题的帖子: Data Next List NULL first 
2017-09-19 21:06
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
写了那么代码多才出问题?
最好写完一个代码块就试编译运行一下。
先改改所有调用malloc()的语句,如:
PtrToNode new_node = malloc(sizeof(struct Node));
改为:
PtrToNode new_node = (PtrToNode)malloc(sizeof(struct Node));


2017-09-20 04:43
yanzy
Rank: 5Rank: 5
等 级:职业侠客
威 望:2
帖 子:104
专家分:372
注 册:2017-2-7
得分:0 
回复 2楼 吹水佬
跟这个没有关系,改了也一样

主要是不知道为什么无法赋值给p->Data
2017-09-20 10:11
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
以下是引用yanzy在2017-9-20 10:11:41的发言:

跟这个没有关系,改了也一样

主要是不知道为什么无法赋值给p->Data

有效的定义和数据类型一至,好象不是赋值问题
说说 Merge 函数做什么的,例如......
2017-09-20 11:53
yanzy
Rank: 5Rank: 5
等 级:职业侠客
威 望:2
帖 子:104
专家分:372
注 册:2017-2-7
得分:0 
回复 4楼 吹水佬
我调试了几次,又改了不少代码,还是这个问题

举例:我从新的代码截取一段
程序代码:
if (t == NULL)
        {
            t = first;   //t 是 PtrToNode t,first 是一个链表的表头 ,此处把t指向该链表表头
            
            PtrToNode new_node = malloc(sizeof(struct Node)); //获取一个内存空间
            if (new_node == NULL)
            {
                printf("Error: malloc failed in add to list\n");
                exit(0);
            }
            first = new_node; //first指向新的内存空间
            for (PtrToNode x; t != NULL; t = t->Next)
            {
                new_node->Data = t->Data; // 此处无法给 new_node->Data 赋值,就是这里
                x = new_node;
                PtrToNode new_node = malloc(sizeof(struct Node));
                if (new_node == NULL)
                {
                    printf("Error: malloc failed in add to list\n");
                    exit(0);
                }
                if (t->Next != NULL)
                    x->Next = new_node;
                else
                {
                    x->Next = NULL;
                    free(new_node);
                }
            }


调试如下
2017-09-20 17:07
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
得分:0 
merge这个函数是链表合并?



[此贴子已经被作者于2017-9-20 17:27编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-09-20 17:23
yanzy
Rank: 5Rank: 5
等 级:职业侠客
威 望:2
帖 子:104
专家分:372
注 册:2017-2-7
得分:0 
回复 6楼 renkejun1942
对,是的
写这里我都要崩溃了
2017-09-20 17:29
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
得分:0 
回复 7楼 yanzy
链表合并挺简单的,你写的好复杂。

我曾经写过一次,不到10行代码吧。

我找找看了。
        

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-09-20 17:35
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
得分:10 


代码找不到了,思路如图。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-09-20 17:42
yanzy
Rank: 5Rank: 5
等 级:职业侠客
威 望:2
帖 子:104
专家分:372
注 册:2017-2-7
得分:0 
单纯的链表合并,以及升序排列,我写成这样是可以了,但是我还想把L1和L2都释放掉,下面的代码是合并后,内存块还是没改变的,所以要另外建一个新链表,然后把这个复制过来。
程序代码:
List Merge(List L1, List L2)
{
    PtrToNode first, t;

    if (L1->Data < L2->Data)
        first = L1;
    else
        first = L2;

    for (; ;)
    {
        if (L1->Data < L2->Data)
        {

            t = L1->Next;
            L1->Next = L2;
            if (t != NULL)
                L1 = t;
        }
        else
        {
            t = L2->Next;
            L2->Next = L1;
            if (t != NULL)
                L2 = t;
        }

        if (t == NULL)
        {
        return first;
        }
      }
}
2017-09-20 17:42



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




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

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