| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3642 人关注过本帖
标题:归并两个递增序列链表为一个递减有序链表
只看楼主 加入收藏
天空Sky
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2015-9-22
收藏
 问题点数:0 回复次数:5 
归并两个递增序列链表为一个递减有序链表
刚学C语言,搞不懂链表。。。
假设有两个按元素值递增有序排列的线性表a和b,均以单链表作为存储结构,请编程实现将表a和表b归并成一个按元素值递减有序排列的线性表c(注意:非严格递减,也就是说本题中的数据有可能相等),并要求利用原表的结点空间构造c表。第一行先输入两个小于100的正整数m,n,第二行从小到大的输入m个整数,第三行从小到大的输入n个整数归并这两个序列为一个递减的序列c,用链表存储,之后输出按顺序输出链表c的值,每个数占一行。
输入样例4 3
2 6 6 10
3 10 50
输出样例
50
10
10
6
6
3
2

同学教我,教完我就出去了。。。但我发现输入与输出格式不对,只能分别输入两个链表的内容,不好意思再麻烦他,各位前辈,请问如何将下面的程序改成该题样式?
typedef struct node
{
    int data;
    struct node *next;
}node,*list;
void init(list &head)
{
    head=(list)malloc(sizeof(node));
    head->next=NULL;
}

void input(list &h)
{
    list p,q;
    q=h;
    //printf("输入数据的个数 n : ");
    int n;
    scanf("%d",&n);
    //printf("请输入 %d 个有序递增数据:\n",n);
    for (int i=0;i<n;i++)
    {
    // printf("第 %d 个: ",i+1);
    p=(list)malloc(sizeof(node));
    scanf("%d",&p->data);
    p->next=q->next;
    q->next=p;
    q=p;
    }
}

void output(list h)
{
    list p;
    p=h->next;
    //printf("输出数据\n");
    while(p!=NULL)
    {
    printf("%d\n",p->data);
    p=p->next;
    }
    printf("\n");
}

void combine(list &a,list &b,list &c)
{
    list p,q,t;
    p=a->next;
    q=b->next;
    free(b);
    b=q;
    c=a;
    a=p;
    c->next=NULL;
    while(p&&q)
    {
    if (p->data<=q->data)
    {
    a=a->next;
    p->next=c->next;
    c->next=p;
    p=a;
    }
    else
    {
    b=q->next;
    q->next=c->next;
    c->next=q;
    q=b;
    }
    }
    if (p!=NULL)
    {
    while(p)
    {
    a=a->next;
    p->next=c->next;
    c->next=p;
    p=a;
    }
    }
    if (q!=NULL)
    {
    while(q)
    {
    b=q->next;
    q->next=c->next;
    c->next=q;
    q=b;
    }
    }

}
int main()
{
    list a,b,c;
    init(a);init(b);
    //printf("\n输入链表A :\n");
    input(a);
    //printf("\n输入链表B :\n");
    input(b);

    //printf("输出合并后的链表:\n");
    combine(a,b,c);
    output(c);
}

[ 本帖最后由 天空Sky 于 2015-9-23 10:52 编辑 ]
搜索更多相关主题的帖子: 元素 空间 C语言 正整数 线性表 
2015-09-23 10:50
林月儿
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:湖南
等 级:版主
威 望:138
帖 子:2277
专家分:10647
注 册:2015-3-19
收藏
得分:0 
程序代码:
#include<stdio.h> 
#include<stdlib.h>
typedef struct node
{
    int data;
    struct node *next;
}node;
node* init(node *head)
{
    head=(node *)malloc(sizeof(node));
    head->next=NULL;
    return head;
}

void input(node *h)
{
    node *p,*q;
    q=h;
    printf("输入数据的个数 n : ");
    int n;
    scanf("%d",&n);
    printf("请输入 %d 个有序递增数据:\n",n);
    for (int i=0;i<n;i++)
    {
        printf("第 %d 个: ",i+1);
        p=(node *)malloc(sizeof(node));
        scanf("%d",&p->data);
        p->next=NULL;
        q->next=p;
        q=p;
    }
    q=NULL;
}

void output(node* h)
{
    node* p;
    p=h->next;
    printf("输出数据\n");
    while(p!=NULL)
    {
        printf("%d\t",p->data);
        p=p->next;
    }
    printf("\n");
}
void sort(node *head)
{
    node *h=head->next,*last=head;
    while(last->next!=NULL)
    {
        last=last->next;
    }
    for(node *r=h;r->next!=NULL;r=r->next)
    {
        node *loc=head;
        while(loc!=last)
        {
            loc=loc->next;
        }
        last=loc;
        for(node *c=h;c->next!=NULL&&c!=loc;c=c->next)
        {
            if(c->data<c->next->data)
            {
                c->data=c->data+c->next->data;
                c->next->data=c->data-c->next->data;
                c->data=c->data-c->next->data;
            }
        }
    }
}
node* combine(node *a,node *b)
{
    node *c=(node *)malloc(sizeof(node));
    sort(a);
    sort(b);
    node *p=a->next,*q=b->next,*t=c;
    while(p!=NULL&&q!=NULL)
    {
        if(p->data>q->data)
        {
            t->next=p;
            t=t->next;
            p=p->next;
        }
        else
        {
            t->next=q;
            t=t->next;
            q=q->next;
        }
    }
    while(p!=NULL){t->next=p;t=t->next;p=p->next;}
    while(q!=NULL){t->next=q;t=t->next;q=q->next;}
    t=NULL;
    return c;
}
int main()
{
    node *a,*b,*c;
    a=init(a);
    b=init(b);
    printf("\n输入链表A :\n");
    input(a);
    printf("\n输入链表B :\n");
    input(b);
    output(a);
    output(b);
    
    printf("输出合并后的链表:\n");
    c=combine(a,b);
    output(c);
}


[ 本帖最后由 林月儿 于 2015-9-23 12:53 编辑 ]

剑栈风樯各苦辛,别时冰雪到时春
2015-09-23 12:49
林月儿
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:湖南
等 级:版主
威 望:138
帖 子:2277
专家分:10647
注 册:2015-3-19
收藏
得分:0 
审题不清,是有序数列啊,sorry

剑栈风樯各苦辛,别时冰雪到时春
2015-09-23 12:52
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
仅供娱乐!

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

typedef struct LinkNodeTag
{
    unsigned data;
    struct LinkNodeTag *next;
}LinkNode, *LinkList;

/*

 * 打印链表

 */
void PrintLink(LinkList l)
{
    if (l == NULL)
    {
        printf("\n");
        return;
    }

    printf("%5d", l->data);
    PrintLink(l->next);
}

/*

 * 创建无头节点链表

 */
LinkList InitLink(int n)
{
    if (n == 0)  return NULL;

    LinkList s = malloc(sizeof(LinkNode));
    scanf("%d", &s->data);
    s->next = InitLink(n - 1);
    return s;
}

/*

 * 销毁链表

 */
void DestroyLink(LinkList l)
{
    if (l != NULL)  DestroyLink(l->next);
    free(l);
}

/*

 * 链表逆序

 */
LinkList ReverseLink(LinkList l)
{
    LinkList p, q, s;

    p = l;
    if (p == NULL)  return NULL;
    q = p->next;
    if (q == NULL)  return p;

    s = ReverseLink(q);

    p->next = NULL;
    q->next = p;

    return s;
}

/*

 * 链表合并

 */
LinkList CombineLink(LinkList a, LinkList b)
{
    if (a == NULL)  return b;
    if (b == NULL)  return a;

    if (a->data < b->data)
    {
        a->next = CombineLink(a->next, b);
        return a;
    }
    else
    {
        b->next = CombineLink(a, b->next);
        return b;
    }
}

/*

 * 主函数

 */
int main(int argc, char *argv[])
{
    int a_len, b_len;

    scanf("%d%d", &a_len, &b_len);
    LinkList a = InitLink(a_len);
    LinkList b = InitLink(b_len);

    PrintLink(a);
    PrintLink(b);

    LinkList c = CombineLink(a, b);
    PrintLink(c);

    c = ReverseLink(c);
    PrintLink(c);

    DestroyLink(c);

    return 0;
}


[ 本帖最后由 azzbcc 于 2015-9-24 11:02 编辑 ]


[fly]存在即是合理[/fly]
2015-09-24 10:51
林月儿
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:湖南
等 级:版主
威 望:138
帖 子:2277
专家分:10647
注 册:2015-3-19
收藏
得分:0 
回复 4楼 azzbcc
漂亮!

剑栈风樯各苦辛,别时冰雪到时春
2015-09-24 11:05
林月儿
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:湖南
等 级:版主
威 望:138
帖 子:2277
专家分:10647
注 册:2015-3-19
收藏
得分:0 
以下是引用azzbcc在2015-9-24 10:51:15的发言:

仅供娱乐!
程序代码:
#include <stdio.h>
#include <stdlib.h>

typedef struct LinkNodeTag
{
    unsigned data;
    struct LinkNodeTag *next;
}LinkNode, *LinkList;

/*

 * 打印链表

 */
void PrintLink(LinkList l)
{
    if (l == NULL)
    {
        printf("\n");
        return;
    }

    printf("%5d", l->data);
    PrintLink(l->next);
}

/*

 * 创建无头节点链表

 */
LinkList InitLink(int n)
{
    if (n == 0)  return NULL;

    LinkList s = malloc(sizeof(LinkNode));//我的编译器此处报错。。。LinkList s =(LinkList)malloc(sizeof(LinkNode));
    scanf("%d", &s->data);
    s->next = InitLink(n - 1);
    return s;
}

/*

 * 销毁链表

 */
void DestroyLink(LinkList l)
{
    if (l != NULL)  DestroyLink(l->next);
    free(l);
}

/*

 * 链表逆序

 */
LinkList ReverseLink(LinkList l)
{
    LinkList p, q, s;

    p = l;
    if (p == NULL)  return NULL;
    q = p->next;
    if (q == NULL)  return p;

    s = ReverseLink(q);

    p->next = NULL;
    q->next = p;

    return s;
}

/*

 * 链表合并

 */
LinkList CombineLink(LinkList a, LinkList b)
{
    if (a == NULL)  return b;
    if (b == NULL)  return a;

    if (a->data < b->data)
    {
        a->next = CombineLink(a->next, b);
        return a;
    }
    else
    {
        b->next = CombineLink(a, b->next);
        return b;
    }
}

/*

 * 主函数

 */
int main(int argc, char *argv[])
{
    int a_len, b_len;

    scanf("%d%d", &a_len, &b_len);
    LinkList a = InitLink(a_len);
    LinkList b = InitLink(b_len);

    PrintLink(a);
    PrintLink(b);

    LinkList c = CombineLink(a, b);
    PrintLink(c);

    c = ReverseLink(c);
    PrintLink(c);

    DestroyLink(c);

    return 0;
}

倒序的要求好像没注意,但既然是娱乐,很赞啦!
递归式写法简洁明了内存回收也有,写的很棒!

剑栈风樯各苦辛,别时冰雪到时春
2015-09-24 11:13
快速回复:归并两个递增序列链表为一个递减有序链表
数据加载中...
 
   



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

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