| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 7853 人关注过本帖
标题:一个链表的值 赋值给 另一个链表,但是失败
取消只看楼主 加入收藏
yanzy
Rank: 5Rank: 5
等 级:职业侠客
威 望:2
帖 子:104
专家分:372
注 册:2017-2-7
结帖率:100%
收藏
已结贴  问题点数:50 回复次数:10 
一个链表的值 赋值给 另一个链表,但是失败
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
yanzy
Rank: 5Rank: 5
等 级:职业侠客
威 望:2
帖 子:104
专家分:372
注 册:2017-2-7
收藏
得分:0 
回复 2楼 吹水佬
跟这个没有关系,改了也一样

主要是不知道为什么无法赋值给p->Data
2017-09-20 10:11
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
yanzy
Rank: 5Rank: 5
等 级:职业侠客
威 望:2
帖 子:104
专家分:372
注 册:2017-2-7
收藏
得分:0 
回复 6楼 renkejun1942
对,是的
写这里我都要崩溃了
2017-09-20 17:29
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
yanzy
Rank: 5Rank: 5
等 级:职业侠客
威 望:2
帖 子:104
专家分:372
注 册:2017-2-7
收藏
得分:0 
回复 9楼 renkejun1942
我10 楼就是你这个思路
2017-09-20 17:51
yanzy
Rank: 5Rank: 5
等 级:职业侠客
威 望:2
帖 子:104
专家分:372
注 册:2017-2-7
收藏
得分:0 
10楼这个也有问题,有些情况没有考虑到
2017-09-20 21:50
yanzy
Rank: 5Rank: 5
等 级:职业侠客
威 望:2
帖 子:104
专家分:372
注 册:2017-2-7
收藏
得分:0 
写了个合并链表并升序排序

程序代码:
List Merge(List L1, List L2)
{
    int n;
    PtrToNode first = L1, t;
    //合并链表
    for (; L1->Next != NULL; L1 = L1->Next)
        ;
    L1->Next = L2;

    //链表排序 升序,只交换 Data
    for(t=first;t->Next!=NULL;)
    {
        if (t->Data > (t->Next)->Data)
        {
            n = t->Data;
            t->Data = (t->Next)->Data;
            (t->Next)->Data = n;
            t = first;
        }
        else
        {
            t = t->Next;
        }
    }
    return first;
}
2017-09-21 10:03
yanzy
Rank: 5Rank: 5
等 级:职业侠客
威 望:2
帖 子:104
专家分:372
注 册:2017-2-7
收藏
得分:0 
回复 15楼 吹水佬
这是一个题目来的,给定了条条框框
比如main函数里面的不能改,然后应该也不能增加新函数,还有输出样例
所以你这个写的很好,就是不能拿来用

题目如下
02-线性结构1 两个有序链表序列的合并(15 分)
本题要求实现一个函数,将两个链表表示的递增整数序列合并为一个非递减的整数序列。

函数接口定义:

List Merge( List L1, List L2 );
其中List结构定义如下:

typedef struct Node *PtrToNode;
struct Node {
    ElementType Data; /* 存储结点数据 */
    PtrToNode   Next; /* 指向下一个结点的指针 */
};
typedef PtrToNode List; /* 定义单链表类型 */
L1和L2是给定的带头结点的单链表,其结点存储的数据是递增有序的;函数Merge要将L1和L2合并为一个非递减的整数序列。应直接使用原序列中的结点,返回归并后的链表头指针。

裁判测试程序样例:

#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;
}

/* 你的代码将被嵌在这里 */
输入样例:

3
1 3 5
5
2 4 6 8 10
输出样例:

1 2 3 4 5 6 8 10
NULL
NULL
2017-09-21 10:14
yanzy
Rank: 5Rank: 5
等 级:职业侠客
威 望:2
帖 子:104
专家分:372
注 册:2017-2-7
收藏
得分:0 
程序代码:
#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 );
List FreeList(List L); //用于链表释放
List Paixu(List L);  //用于链表排序

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

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

    int n;
    for (;;)
    {
        printf("Enter a series of integers (0 to terminate): ");
        scanf("%d", &n);
        if (n == 0)//当输入为0则退出循环
            break;
        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;
    }
    return Paixu(first);
}

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

List Merge(List L1, List L2)
{
    //合并链表
    PtrToNode first = NULL;
    while (L1 != NULL)//创建并把旧链表复制到新链表
    {
        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 = L1->Data;
        new_node->Next = first;
        first = new_node;
        L1 = L1->Next;
    }
    
    while (L2 != NULL)//创建并把旧链表复制到新链表
    {
        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 = L2->Data;
        new_node->Next = first;
        first = new_node;
        L2 = L2->Next;
    }
    return Paixu(first);
}

List Paixu(List L)//链表排序 升序,只交换 Data
{
    int n;
    PtrToNode first = L, t;
    for (t = first; t->Next != NULL;)
    {
        if (t->Data > (t->Next)->Data)
        {
            n = t->Data;
            t->Data = (t->Next)->Data;
            (t->Next)->Data = n;
            t = first;
        }
        else
        {
            t = t->Next;
        }
    }
    return first;
}

List FreeList(List L)
{
    for (List t; L != NULL;)
    {
        t = L;
        L = L->Next;
        free(t);
    }

    return NULL;
}


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

2017-09-22 08:48
快速回复:一个链表的值 赋值给 另一个链表,但是失败
数据加载中...
 
   



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

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