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

线性表求并集

tianxiao110 发布于 2010-09-02 10:42, 2947 次点击
这不大二刚刚开学,开了c语言的数据库,教材上只讲了,算法和实现的问题,没有具体的实例。为此很是纠结。
希望有人能帮我写个,简单的实例。

例如:已知线性表 LA=(1,2,3) 线性表LB=(3,4,5) 然后求线性表LC。 (C是A和B的并集)
真的很希望有人能帮帮我,真的谢谢了。(最好能写的很基础,毕竟初学嘛,呵呵)
 
5 回复
#2
peterjim2010-09-04 12:06
并集就是把LB不同于LA中的元素连接到LA中;我觉得该题可采用链接法较简单;代码下次给你写,现在没时间了,该下机了
#3
asdjc2010-09-04 17:19
你这个顺序表好写。
a=a(i);b=b(j);
再用for()语句递推,当a(i)<b(j)时i++;
a(i)==b(j)时c(k)=a(i);
当a(i)>b(j)时j++;
#4
2010-09-04 22:33
程序代码:

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

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

LinkList InitList() //初始化头结点
{
    LinkList L;
    L=(LinkList)malloc(sizeof(LNode));
    L->link=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->link=p;
        q=p;
        scanf("%d",&_data);
    }
    q->link=NULL;
}

void CombineList(LinkList L1,LinkList L2) //求两个链表和并集,假设链表数据是递增排序的。
{
    LinkList pointer = L1;
    LinkList p=L1->link;
    LinkList q=L2->link;
    LinkList v=NULL; //v用来记录p与q中data域较小的结点
   
    pointer->data=0x7fffffff;//保证pointer->data于链表结点的data不同,不会对算法有影响。
   
//进行合并,每次选取p,q中比较小的结点与pointer指针比较,
   
//如果相同就舍去,如果不同就加入链表中,直到其中一个链表遍历完为止
    while(p && q)
    {
        if( p->data < q->data )
        {
            v=p;
            p=p->link;
        }
        else
        {
            v=q;
            q=q->link;
        }
   
        if(v->data == pointer->data )
        {
            free(v);
            v=NULL;
        }
        else
        {
            pointer->link = v;
            pointer=v;
        }
    }
   
    //如果其中一个链表还有结点,则将其与L1链表尾想连
   
//如果其中还有重复的结点就删除多余的,只留一个。
    if(p)
    pointer->link=p;

    if(q)
    pointer->link=q;
   
    p=pointer->link;
    //删除剩下的一个链表中重复的结点,如果没有剩下脸表,那么pointer=NULL,函数结束。
    while(pointer)
    {
        if(p && pointer->data == p->data)
        {
            v=p->link;
            pointer->link=v;
            free(p);
            p=v;
        }
        else if( p )
        {
            pointer=pointer->link;
            p=p->link;
         }
         else
          break;
     }
}

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

int main()
{
    LinkList L1,L2;
    L1=InitList();
    L2=InitList();
    CreatList(L1);
    CreatList(L2);
   
    CombineList(L1,L2);
    free(L2);
    L2=NULL;
   
    DisplayList(L1);
    return 0;
}
#5
2010-09-04 22:34
我可能是想多了............

[ 本帖最后由 LegendofMine 于 2010-9-4 22:35 编辑 ]
#6
血纹猛男2010-09-05 01:16
这个不知道是不是你要的,如果不是,在这里还有其他资源呵呵,希望你能很快找到这个地方有,建议最好买本书或者一套题做做,这个看电子版的用处不大。
1