两个表指定条件的笛卡尔连接

#include<stdio.h>
#include<malloc.h>

#define maxcol 10
typedef int ElemType;
typedef struct dlist
{
    ElemType data[maxcol];
    struct dlist *next;
}Dlist;
typedef struct hlist
{
    int row;
    int col;
    Dlist *next;
}Hlist;
void creatlist(Hlist **h);
void destory(Hlist **h);
void displist(Hlist *h);
void lianjielist(Hlist *h1,Hlist *h2,Hlist **h);
void creatlist(Hlist **h)
{
    if((*h) == NULL)
    {
        Dlist *p,*s;
        int i = 0;
        int j = 0;
        *h = malloc(sizeof(Hlist));
        (*h)->next = NULL;
        printf("请输入表的行和列\n");
        scanf("%d,%d",&(*h)->row,&(*h)->col);
            while(i < (*h)->row)
        {
            p = malloc(sizeof(Dlist));
            printf("请输入第%d行的数据\n",i+1);
            for (j = 0;j<(*h)->col;j++)
               scanf("%d",&p->data[j]);
                if((*h)->next == NULL)//注意由于表的头结点与后面的数据节点不是同一结构体类型,才需分情况。
                (*h)->next = p;
                else
                s->next = p;
            s = p;//只有不是头结点,数据节点才可赋值。
            i++;
        }
        s->next = NULL;
    }
}
void destory(Hlist **h)
{
    Dlist *s = (*h)->next;
    Dlist *p;
    while(s)
    {
        p = s->next;
        free(s);
        s = p;
    }
    free(*h);
    *h = NULL;
}
void displist(Hlist *h)
{
    Dlist *p = h->next;
    int i = 0;
    while(p)
    {
        for(i = 0;i< h->col;i++)
            printf("%4d",p->data[i]);
        printf("\n");
        p = p->next;
    }
}
void lianjielist(Hlist *h1,Hlist *h2,Hlist **h)
{
    Dlist *s = h1->next;//s控制连接的停止。
    Dlist *p,*r;//r指向h表的最后一个节点
    Dlist *q = h2->next;
    int i = 0,j = 0;
    int a,b;
    printf("请输入连接的条件:第a列等于b列(a,b)\n");
    scanf("%d,%d",&a,&b);
    *h = malloc(sizeof(Hlist));
    (*h)->col = h1->col + h2->col;
    (*h)->next = NULL;
    (*h)->row = 0;
    while(s)//指向第一个表的当前处理的节点
    {   
        q = h2->next;
        while(q)//指向第二个表的当前处理的节点
        {
            if(s->data[a-1] == q->data[b-1])
            {
                p = malloc(sizeof(Dlist));
                for(i = 0;i<h1->col;i++)
                    p->data[i] = s->data[i];
                for(j = 0;j<h2->col;j++)
                    p->data[j+i] = q->data[j];
                    if((*h)->next == NULL)
                        (*h)->next = p;
                    else
                        r->next = p ;
                    r = p;
                    (*h)->row++;
            }
            q = q->next;
        }
    s = s->next;    
    }
    r->next = NULL;//第一次忘了写,很重要
}
int main(void)
{
    Hlist *h1 = NULL,*h2 = NULL,*h = NULL;
    creatlist(&h1);
    creatlist(&h2);
    printf("表1的元素为:\n");
    displist(h1);
    printf("表2的元素为:\n");
    displist(h2);
    lianjielist(h1,h2,&h);
    displist(h);
    destory(&h);
    destory(&h1);
    destory(&h2);
    return 0;
}
//p53(数据结构)李春煲
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值