| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1527 人关注过本帖
标题:两有序链表组成一个有序链表,只能莫名为空?请大神看一看!
只看楼主 加入收藏
S140131022
Rank: 2
来 自:重庆邮电大学
等 级:论坛游民
帖 子:205
专家分:35
注 册:2014-10-9
结帖率:90.24%
收藏
已结贴  问题点数:20 回复次数:3 
两有序链表组成一个有序链表,只能莫名为空?请大神看一看!
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

typedef struct _tag_linklistnode TLinkListNode;

struct _tag_linklistnode
{
    TLinkListNode* next;
};

struct Value
{
    TLinkListNode* next;
    int data;
};

typedef struct _tag_linklist
{
    TLinkListNode header;
    int length;
}TLinkList;
void LinkList_ShowList(TLinkList* list);
TLinkList* LinkList_Create()
{
    TLinkList* ret = (TLinkList*)malloc(sizeof(TLinkList));
    if(ret != NULL)
    {
        ret->header.next = NULL;
        ret->length = 0;
    }
    return ret;
} 

int LinkList_Length(TLinkList* list)
{
    int ret = -1;
    if(list != NULL)
    {
        ret = list->length;
    }
    return ret;
}

int LinkList_Insert(TLinkList* list,TLinkListNode* node,int pos)
{
    int ret = 1;
    ret = ret && (list != NULL) && (node != NULL) && (pos >= 0);
    if(ret)
    {
        TLinkListNode* current = (TLinkListNode*)list;
        for(int i = 0;(i < pos) && (current->next != NULL);i++)
        {
            current = current->next;
        }
        node->next = current->next;
        current->next = node;
        list->length++;
    }
    return ret;
}

TLinkListNode* LinkList_Delete(TLinkList* list,int pos)
{
    TLinkListNode* ret = NULL;
    if(list != NULL && pos >= 0 && pos < list->length)
    {
        TLinkListNode* current = (TLinkListNode*)list;
        for(int i = 0;i < pos;i++)
        {
            current = current->next;
        }
        ret = current->next;
        ret->next = current->next;
        list->length--;
    }
    return ret;
}

TLinkListNode* LinkList_Get(TLinkList* list,int pos)
{
    TLinkListNode* ret = NULL;
    if(list != NULL && pos >= 0 && pos < list->length)
    {
        TLinkListNode* current = (TLinkListNode*)list;
        for(int i = 0;i < pos;i++)
        {
            current = current->next;
        }
        ret = current->next;
    }
    return ret;
}

TLinkList* LinkList_Belind(TLinkList* list1,TLinkList* list2)
{
    if(list1 == NULL && list2 == NULL)
        return NULL;
    if(list1 == NULL)
        return list2;
    if(list2 == NULL)
        return list1;
    TLinkList* list3 = LinkList_Create();
    TLinkListNode* first = list1->header.next;
    TLinkListNode* second = list2->header.next;
    while(first != NULL && second != NULL)
    {
        if(((struct Value*)first)->data > ((struct Value*)second)->data)
        {
            LinkList_Insert(list3,second,LinkList_Length(list3));
            second = second->next;
        }
        if(((struct Value*)first)->data <= ((struct Value*)second)->data)
        {
            LinkList_Insert(list3,first,LinkList_Length(list3));
            first = first->next;    //用VC调试,发现first->next值为空,为什么呢?
        }
    }
    while(first != NULL)
    {
        LinkList_Insert(list3,first,LinkList_Length(list3));
        first = first->next;
    }
    while(second != NULL)
    {
        LinkList_Insert(list3,second,LinkList_Length(list3));
        second = second->next;
    }
    return     list3;
}

void LinkList_ShowList(TLinkList* list)
{
    if(list == NULL)
        return;
    TLinkListNode* current = list->header.next;
    while(current != NULL)
    {
        printf("%d ",((struct Value*)current)->data);
        current = current->next;
    }

}

int main()
{
    struct Value v1;        v1.data = 1;
    struct Value v2;        v2.data = 2;
    struct Value v3;        v3.data = 3;
    struct Value v4;        v4.data = 4;    
    struct Value v5;        v5.data = 5;
    struct Value v6;        v6.data = 6;
    struct Value v7;        v7.data = 7;
    struct Value v8;        v8.data = 8;
    struct Value v9;        v9.data = 9;

    TLinkList* List1 = LinkList_Create();
    TLinkList* List2 = LinkList_Create();
    LinkList_Insert(List1,(TLinkListNode*)&v1,LinkList_Length(List1));
    LinkList_Insert(List2,(TLinkListNode*)&v2,LinkList_Length(List2));
    LinkList_Insert(List1,(TLinkListNode*)&v3,LinkList_Length(List1));
    LinkList_Insert(List2,(TLinkListNode*)&v4,LinkList_Length(List2));
    LinkList_Insert(List1,(TLinkListNode*)&v5,LinkList_Length(List1));
    LinkList_Insert(List2,(TLinkListNode*)&v6,LinkList_Length(List2));
    LinkList_Insert(List1,(TLinkListNode*)&v7,LinkList_Length(List1));
    LinkList_Insert(List2,(TLinkListNode*)&v8,LinkList_Length(List2));
    LinkList_Insert(List2,(TLinkListNode*)&v9,LinkList_Length(List2));
    LinkList_ShowList(List1);
    LinkList_ShowList(List2);
    printf("\nList1 Length = %d\n",LinkList_Length(List1));
    printf("List2 Length = %d\n",LinkList_Length(List2));
    TLinkList* newList = LinkList_Belind(List1,List2);
    printf("Len = %d\n",LinkList_Length(newList));
    for(int i = 0;i < LinkList_Length(newList);++i)
    {
    //    printf("%d\n",((struct Value*)LinkList_Get(newList,i))->data);
    }
    return 0;
}

2016-07-10 15:12
S140131022
Rank: 2
来 自:重庆邮电大学
等 级:论坛游民
帖 子:205
专家分:35
注 册:2014-10-9
收藏
得分:0 
输出结果也不对~ 不知道为什么~

既然还有不甘心
就还没到放弃的时候~
2016-07-10 15:12
word123
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:13
帖 子:333
专家分:1622
注 册:2014-4-5
收藏
得分:10 
LinkList_Insert函数里面 node->next = current->next;
因此node->next为空   若传入first那么first->next为空
这里用一个变量temp来暂存取出的节点

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

typedef struct _tag_linklistnode TLinkListNode;

struct _tag_linklistnode
{
    TLinkListNode* next;
};

struct Value
{
    TLinkListNode* next;
    int data;
};

typedef struct _tag_linklist
{
    TLinkListNode header;
    int length;
}TLinkList;
void LinkList_ShowList(TLinkList* list);
TLinkList* LinkList_Create()
{
    TLinkList* ret = (TLinkList*)malloc(sizeof(TLinkList));
    if(ret != NULL)
    {
        ret->header.next = NULL;
        ret->length = 0;
    }
    return ret;
}

int LinkList_Length(TLinkList* list)
{
    int ret = -1;
    if(list != NULL)
    {
        ret = list->length;
    }
    return ret;
}

int LinkList_Insert(TLinkList* list,TLinkListNode* node,int pos)
{
    int ret = 1;
    ret = ret && (list != NULL) && (node != NULL) && (pos >= 0);
    if(ret)
    {
        TLinkListNode* current = (TLinkListNode*)list;
        for(int i = 0;(i < pos) && (current->next != NULL);i++)
        {
            current = current->next;
        }
        node->next = current->next;
        current->next = node;
        list->length++;
    }
    return ret;
}

TLinkListNode* LinkList_Delete(TLinkList* list,int pos)
{
    TLinkListNode* ret = NULL;
    if(list != NULL && pos >= 0 && pos < list->length)
    {
        TLinkListNode* current = (TLinkListNode*)list;
        for(int i = 0;i < pos;i++)
        {
            current = current->next;
        }
        ret = current->next;
        ret->next = current->next;
        list->length--;
    }
    return ret;
}

TLinkListNode* LinkList_Get(TLinkList* list,int pos)
{
    TLinkListNode* ret = NULL;
    if(list != NULL && pos >= 0 && pos < list->length)
    {
        TLinkListNode* current = (TLinkListNode*)list;
        for(int i = 0;i < pos;i++)
        {
            current = current->next;
        }
        ret = current->next;
    }
    return ret;
}

TLinkList* LinkList_Belind(TLinkList* list1,TLinkList* list2)
{
    if(list1 == NULL && list2 == NULL)
        return NULL;
    if(list1 == NULL)
        return list2;
    if(list2 == NULL)
        return list1;
    TLinkList* list3 = LinkList_Create();
    TLinkListNode* first = list1->header.next;
    TLinkListNode* second = list2->header.next;

    TLinkListNode* temp = NULL;
    while(first != NULL && second != NULL)
    {
        if(((struct Value*)first)->data > ((struct Value*)second)->data)
        {
            temp = second;
            second = second->next;
            LinkList_Insert(list3,temp,LinkList_Length(list3));
            
        }
        if(((struct Value*)first)->data <= ((struct Value*)second)->data)
        {
            temp = first;
            first = first->next;
            LinkList_Insert(list3,temp,LinkList_Length(list3));
            
        }
    }
    while(first != NULL)
    {
        temp = first;
        first = first->next;
        LinkList_Insert(list3,temp,LinkList_Length(list3));
    }
    while(second != NULL)
    {
        temp = second;
        second = second->next;
        LinkList_Insert(list3,temp,LinkList_Length(list3));
    }
    return     list3;
}

void LinkList_ShowList(TLinkList* list)
{
    if(list == NULL)
        return;
    TLinkListNode* current = list->header.next;
    while(current != NULL)
    {
        printf("%d ",((struct Value*)current)->data);
        current = current->next;
    }

}

int main()
{
    struct Value v1;        v1.data = 1;
    struct Value v2;        v2.data = 2;
    struct Value v3;        v3.data = 3;
    struct Value v4;        v4.data = 4;   
    struct Value v5;        v5.data = 5;
    struct Value v6;        v6.data = 6;
    struct Value v7;        v7.data = 7;
    struct Value v8;        v8.data = 8;
    struct Value v9;        v9.data = 9;

    TLinkList* List1 = LinkList_Create();
    TLinkList* List2 = LinkList_Create();
    LinkList_Insert(List1,(TLinkListNode*)&v1,LinkList_Length(List1));
    LinkList_Insert(List2,(TLinkListNode*)&v2,LinkList_Length(List2));
    LinkList_Insert(List1,(TLinkListNode*)&v3,LinkList_Length(List1));
    LinkList_Insert(List2,(TLinkListNode*)&v4,LinkList_Length(List2));
    LinkList_Insert(List1,(TLinkListNode*)&v5,LinkList_Length(List1));
    LinkList_Insert(List2,(TLinkListNode*)&v6,LinkList_Length(List2));
    LinkList_Insert(List1,(TLinkListNode*)&v7,LinkList_Length(List1));
    LinkList_Insert(List2,(TLinkListNode*)&v8,LinkList_Length(List2));
    LinkList_Insert(List2,(TLinkListNode*)&v9,LinkList_Length(List2));
    LinkList_ShowList(List1);
    LinkList_ShowList(List2);
    printf("\nList1 Length = %d\n",LinkList_Length(List1));
    printf("List2 Length = %d\n",LinkList_Length(List2));
    TLinkList* newList = LinkList_Belind(List1,List2);
    printf("Len = %d\n",LinkList_Length(newList));
    for(int i = 0;i < LinkList_Length(newList);++i)
    {
    //    printf("%d\n",((struct Value*)LinkList_Get(newList,i))->data);
    }
     LinkList_ShowList(newList);
     printf("\n");
    return 0;
}

2016-07-10 18:53
lanke711
Rank: 9Rank: 9Rank: 9
来 自:流浪在天国之路
等 级:蜘蛛侠
威 望:7
帖 子:317
专家分:1437
注 册:2015-7-16
收藏
得分:10 
怪不得没人回答。代码又长还不加注释,谁有那么长的时间来研究啊。

程序代码:
if(((struct Value*)first)->data <= ((struct Value*)second)->data)
        {
            LinkList_Insert(list3,first,LinkList_Length(list3));
            first = first->next;    //用VC调试,发现first->next值为空,为什么呢?
        }

这里first->next为空,那就返回去看一下first的初始化
TLinkListNode* first = list1->header.next;
<--------------------因为得到的是空值

完了。看得我头也晕。楼主从你要问的问题反向调试。再从list1调试回去。。。。

普通人之所以普通,是因为他们普遍有一个通病,那就是认为自己永远普通。
千夫所指,我亦坚持。就算被所有人误解,我也照样守护这一切。
我们总是觉得,这些灵魂的表情,傲慢自大,目中无人,其实,真正目中无人的是我们。它们傲慢的不过是表情,而我们傲慢的却是行为!
记得,是为了忘记!
只要想着有那么一天,我就能忍受现在的每一天!
灾难并不可怕,可怕的是心中没有了希望。
你以为我在天堂,其实我正在路上。
当你觉得自己走不到终点的时候,请不要放弃。或许你的对手也是这种感觉。
2016-07-10 19:02
快速回复:两有序链表组成一个有序链表,只能莫名为空?请大神看一看!
数据加载中...
 
   



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

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