注册 登录
编程论坛 数据结构与算法

求高手帮看下这个程序,是关于线性链表的

lly10120303 发布于 2011-04-30 21:51, 575 次点击
#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;
}
6 回复
#2
mayuebo2011-05-01 09:34
看什么?你的代码吗?如果有问题可以说一下
#3
三月的雪2011-05-01 17:40
程序代码:
#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 编辑 ]
#4
亚洲飞鹰2011-05-01 21:42
强大,楼上的各位都很强大,至于链表,希望楼主去看一下书,严蔚敏的教材很好,但是理论性太强,不知道是不适合楼主胃口。
#5
永希2011-05-01 22:10
你这是C语言的代码吧 。我求C#的。
#6
lly101203032011-05-05 10:24
回复 2楼 mayuebo
你好,非常谢谢你的回帖,这个程序差不多都懂了,但是为什么那个合并的函数那样编写不行呢?还有就是,LinkList CombineList(LinkList L1,LinkList L2,LinkList &L3)为什么会编译出错,什么时候要用那个&
#7
三月的雪2011-05-05 20:15
合并那个函数,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);
1