| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 379 人关注过本帖
标题:合成两个有序链表不知道错在哪里,求高手帮忙!
只看楼主 加入收藏
lxslxs123
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2014-11-17
结帖率:80%
收藏
已结贴  问题点数:25 回复次数:6 
合成两个有序链表不知道错在哪里,求高手帮忙!
程序代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
    int data;
    struct node* next;
}lnode,*linklist;

 
linklist list_create(int n);
void list_print(linklist L);
linklist list_together(linklist L1,linklist L2);

 
int main()
{
    linklist L1=list_create(3);
    linklist L2=list_create(3);//创建两个新的链表
 
    list_print(list_together(L1,L2));//输出合成后的链表
    return 0;
}

 
linklist list_create(int n)//建立新的链表
{
    int i;
    linklist L,q,p;
    L=(linklist)malloc(sizeof(lnode));
    if(!L)return 0;
    L->next=NULL;
    p=L;
    for(i=1;i<=n;i++)
    {
        q=(linklist)malloc(sizeof(lnode));
        if(!q)return 0;
        printf("Please input the NO.%d number:",i);
        scanf("%d",&q->data);
        p->next=q;
        q->next=NULL;
        p=q;
    }
    return L;
}

 
linklist list_together(linklist L1,linklist L2)//合成1,2两个有序链表
{
    linklist p1,p2,p3,L3;
    p1=L1->next;
    p2=L2->next;
    L3=p3=(linklist)malloc(sizeof(lnode));
    if(!p3)exit(1);
    L3->next=p3->next=NULL;

 
    while(p1&&p2)//将L1,L2两个链表里的值从第一个开始比较
    {
        if(p1->data<=p2->data)
        {
            p3->next=p1;
            p3=p3->next;
            p1=p1->next;
        }
        if(p2->data<=p1->data)
        {
            p3->next=p1;
            p3=p3->next;
            p1=p1->next;
        }
    }//谁的值更小就将它赋给L3
        //两个链表总会有一个先空,下面判断是哪个链表先空的
    if(p1==NULL)
    {
        p3->next=p2;
        free(L1);L1=NULL;
    }
    if(p2==NULL)
    {
        p3->next=p1;
        free(L2);L2=NULL;
    }//将L3连接到没空的那个链表头上,再释放掉另一个链表
    return L3;
}

 
void list_print(linklist L)//将合成后的链表输出
{
    linklist p=L->next;
    while(p)
    {
        printf("%d ",p->data);
        p=p->next;
    }
}

图片附件: 游客没有浏览图片的权限,请 登录注册
搜索更多相关主题的帖子: color 
2014-12-27 20:46
longwu9t
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:732
专家分:2468
注 册:2014-10-9
收藏
得分:25 
图片附件: 游客没有浏览图片的权限,请 登录注册

是要这个效果么?

Only the Code Tells the Truth             K.I.S.S
2014-12-27 21:16
lxslxs123
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2014-11-17
收藏
得分:0 
回复 2楼 longwu9t
对!是这样的!就是两个有序数组合并,能麻烦指点一下么,非常感激!
2014-12-27 21:19
longwu9t
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:732
专家分:2468
注 册:2014-10-9
收藏
得分:0 
程序代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
    int data;
    struct node* next;
} lnode, *linklist;

linklist list_create(int n);
void list_print(linklist L);
linklist list_together(linklist L1, linklist L2);

int main(void) {
    linklist L1 = list_create(3);
    linklist L2 = list_create(3);
    linklist L3 = (linklist)malloc(sizeof(L1) + sizeof(L2));
    L3 = list_together(L1, L2);
    list_print(L3);
    free(L1);
    free(L2);
    free(L3);
    return 0;
}

linklist list_create(int n) {
    int i;
    linklist L, q, p;
    L = (linklist)malloc(sizeof(lnode));

    if(!L) return 0;

    L->next = NULL;
    p = L;

    for(i = 1; i <= n; i++) {
        q = (linklist)malloc(sizeof(lnode));

        if(!q) return 0;

        printf("Please input the NO.%d number: ", i);
        scanf("%d", &q->data);
        p->next = q;
        q->next = NULL;
        p = q;
    }

    return L;
}

linklist list_together(linklist L1, linklist L2) {
    linklist p1, p2, p3, L3;
    p1 = L1->next;
    p2 = L2->next;
    L3 = p3 = (linklist)malloc(sizeof(L1) + sizeof(L2));

    if(!p3) exit(1);

    L3->next = p3->next = NULL;

    while(p1 && p2) {
        if(p1->data <= p2->data) {
            p3->next = p1;
            p3 = p3->next;
            p1 = p1->next;

        } else {
            p3->next = p2;
            p3 = p3->next;
            p2 = p2->next;
        }
    }

    if(p1 == NULL) {
        p3->next = p2;

    } else {
        p3->next = p1;
    }

    return L3;
}

void list_print(linklist L) {
    linklist p = L->next;

    while(p) {
        printf("%d ", p->data);
        p = p->next;
    }

    printf("\n");
}

Only the Code Tells the Truth             K.I.S.S
2014-12-27 21:22
lxslxs123
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2014-11-17
收藏
得分:0 
回复 4楼 longwu9t
非常感谢您的回答!但我刚想了一下觉得还是有些小问题
1.就是你在together函数里没有free(L3)是不是因为函数调用完了这个指针会直接free掉,根本不用自行free?
2.就是我觉得无论在主函数还是together函数里都没必要给L3单独开辟一个空间?
希望您能帮我!
2014-12-27 22:04
longwu9t
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:732
专家分:2468
注 册:2014-10-9
收藏
得分:0 
回复 5楼 lxslxs123
我也是初学者 你的问题我没有准确答案 很抱歉

Only the Code Tells the Truth             K.I.S.S
2014-12-27 22:19
lxslxs123
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2014-11-17
收藏
得分:0 
回复 6楼 longwu9t
没事,还是很谢谢你!
2014-12-28 11:19
快速回复:合成两个有序链表不知道错在哪里,求高手帮忙!
数据加载中...
 
   



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

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