| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 575 人关注过本帖
标题:求高手帮看下这个程序,是关于线性链表的
只看楼主 加入收藏
lly10120303
Rank: 2
等 级:论坛游民
帖 子:11
专家分:12
注 册:2011-3-30
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:6 
求高手帮看下这个程序,是关于线性链表的
#include <stdio.h>
#include <stdlib.h>

typedef struct LISTSTRUCT //线性表结点
{
    int data;
    struct LISTSTRUCT *next;
}LNode,*LinkList;

LinkList InitList() //初始化头结点
{
    LinkList L;
    L=(LinkList)malloc(sizeof(LNode));
    L->next=NULL;
    return L;
}

void CreatList(LinkList L) //出入链表数据,采用尾插法。
{
    int _data;
    LinkList p,q=L;
    scanf("%d",&_data);
    while(_data!=2012)
    {
        p=(LinkList)malloc(sizeof(LNode));
        p->data = _data;
        q->next=p;
        q=p;
        scanf("%d",&_data);
    }
    q->next=NULL;
}

LinkList CombineList(LinkList L1,LinkList L2,LinkList L3) //求两个链表和并集,假设链表数据是递增排序的。
{
    L3=InitList();
    LinkList p1=L1->next;//说这里的LinkList使用不合法
    LinkList p2=L2->next;
    LinkList p3=L3;
    while(p1 &&p2)
    {
        if( p1->data < p2->data )
        {
            p3->next=p1;
            p1=p1->next;
        }
        if( p1->data > p2->data )
        {
            p3->next=p2;
            p2=p2->next;
        }
        if( p1->data = p2->data )
        {
          p1=p1->next;
        }
   
    }//while
   
    //如果其中一个链表还有结点,则将其与L1链表尾想连
    //如果其中还有重复的结点就删除多余的,只留一个。
    if(p1)
    p3->next=p1;

    if(p2)
    p3->next=p2;
    free(L1);
    free(L2);
    return L3;
}

void DisplayList(LinkList L)//输出链表数据
{
    L=L->next;
    while(L)
    {
        printf("%d  ",L->data);
        L=L->next;
    }
    printf("\n");
}

int main()
{
    LinkList L1,L2;
    L1=InitList();
    L2=InitList();
    CreatList(L1);
    CreatList(L2);
   
    CombineList(L1,L2,L3);
    DisplayList(L3);
    return 0;
}
搜索更多相关主题的帖子: 线性表 return 
2011-04-30 21:51
mayuebo
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:6
帖 子:257
专家分:1282
注 册:2005-9-8
收藏
得分:4 
看什么?你的代码吗?如果有问题可以说一下

成功贵在坚持
2011-05-01 09:34
三月的雪
Rank: 2
等 级:论坛游民
帖 子:18
专家分:35
注 册:2011-4-14
收藏
得分:10 
程序代码:
#include <stdio.h>
#include <stdlib.h>

typedef struct LISTSTRUCT //线性表结点
{
    int data;
    struct LISTSTRUCT *next;
}LNode,*LinkList;

LinkList InitList() //初始化头结点
{
    LinkList L;
    L=(LinkList)malloc(sizeof(LNode));
    L->next=NULL;
    return L;
}

void CreatList(LinkList L) //出入链表数据,采用尾插法。
{
    int _data;
    LinkList p,q=L;
    scanf("%d",&_data);
    while(_data!=2012)
    {
        p=(LinkList)malloc(sizeof(LNode));
        p->data = _data;
        q->next=p;
        q=p;
        scanf("%d",&_data);
    }
    q->next=NULL;
}

LinkList CombineList(LinkList L1,LinkList L2,LinkList L3) //求两个链表和并集,假设链表数据是递增排序的。
{
    LinkList p1,p2,p3; //先声明,再使用。
   
    p1=L1->next;//说这里的LinkList使用不合法
    p2=L2->next;
    L3=InitList();
    p3=L3;
    while(p1&&p2)
    {
        if( p1->data < p2->data )
        {
            p3->next=p1;
            p1=p1->next;
            p3=p3->next; //添加了p3的移动和continue
            continue;
        }
        if( p1->data > p2->data )
        {
            p3->next=p2;
            p2=p2->next;
            p3=p3->next;
            continue;
        }
        if( p1->data == p2->data )// = 改成 ==
        {
          p1=p1->next;
          p2=p2->next;
          p3=p3->next;
          continue;
        }
   
    }//while
   
    //如果其中一个链表还有结点,则将其与L1链表尾想连
    //如果其中还有重复的结点就删除多余的,只留一个。
    if(p1)
        p3->next=p1;
    if(p2)
        p3->next=p2;
    free(L1);
    free(L2);
    return L3;
}

void DisplayList(LinkList L)//输出链表数据
{
    L=L->next;
    while(L)
    {
        printf("%d  ",L->data);
        L=L->next;
    }
    printf("\n");
}

int main()
{
    LinkList L1,L2,L3;
    L1=InitList();
    L2=InitList();
    CreatList(L1);
    CreatList(L2);
   
    L3 = CombineList(L1,L2,L3);     //CombineList(L1,L2,L3)这样不行
    DisplayList(L3);
    return 0;
} 
尽量顺着楼主的思路来改的。



[ 本帖最后由 三月的雪 于 2011-5-1 17:51 编辑 ]

朝花夕拾
2011-05-01 17:40
亚洲飞鹰
Rank: 2
等 级:论坛游民
帖 子:35
专家分:17
注 册:2010-6-1
收藏
得分:5 
强大,楼上的各位都很强大,至于链表,希望楼主去看一下书,严蔚敏的教材很好,但是理论性太强,不知道是不适合楼主胃口。
2011-05-01 21:42
永希
Rank: 2
等 级:论坛游民
帖 子:12
专家分:15
注 册:2011-4-12
收藏
得分:1 
你这是C语言的代码吧 。我求C#的。
2011-05-01 22:10
lly10120303
Rank: 2
等 级:论坛游民
帖 子:11
专家分:12
注 册:2011-3-30
收藏
得分:0 
回复 2楼 mayuebo
你好,非常谢谢你的回帖,这个程序差不多都懂了,但是为什么那个合并的函数那样编写不行呢?还有就是,LinkList CombineList(LinkList L1,LinkList L2,LinkList &L3)为什么会编译出错,什么时候要用那个&
2011-05-05 10:24
三月的雪
Rank: 2
等 级:论坛游民
帖 子:18
专家分:35
注 册:2011-4-14
收藏
得分:0 
合并那个函数,CombineList(L1,L2,L3)这样调用,只是把L3这样一个指针变量传进去而已,在传入函数之前,它未指向任何地址,然后,在函数内部它指向了一个地址,最后由于是传值调用,回到函数外边的时候它还是未指向任何地址的。
L3 = CombineList 是把最后指向的地址返回赋值给L3,所以当然可以了。

&是取值运算符,在函数声明的时候,C语言里没有“LinkList CombineList(LinkList L1,LinkList L2,LinkList &L3)”这种语法,一般是在实参传递的时候用的,如: LNode L1,L2,L3;  CombineList(&L1,&L2,&L3);

朝花夕拾
2011-05-05 20:15
快速回复:求高手帮看下这个程序,是关于线性链表的
数据加载中...
 
   



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

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