| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 544 人关注过本帖
标题:帮我解决一下我的求链表交集的问题
只看楼主 加入收藏
lizjohn
Rank: 1
等 级:新手上路
帖 子:54
专家分:0
注 册:2010-10-28
结帖率:70.59%
收藏
已结贴  问题点数:20 回复次数:3 
帮我解决一下我的求链表交集的问题
程序代码:
#include<stdio.h>
#include<stdlib.h>
struct number{
    int data;
    struct number*next ;
};
struct number*creat()                          //创建
{
    struct number*p1,*p2,*sq;
    p2=sq=(struct number*)malloc(sizeof(struct number));
    p1=(struct number*)malloc(sizeof(struct number));
    scanf(" %d",&p1->data);
    while(p1->data!=0)
    {p2->next=p1;
    p2=p1;
    p1=(struct number*)malloc(sizeof(struct number));
    scanf(" %d",&p1->data);
    }
    return sq;
}
void print(struct number*sq)                 //输出
{
    struct number*p1;
    p1=sq->next;
    while(p1!=NULL)
    {
        printf(" %d",p1->data);
        p1=p1->next;
    }
}


void main()
{
    struct number*l1,*l2,*l3,*pa,*pb,*t,*t1;
    l1=creat();
    l2=creat();
    pa=l1->next;
    pb=l2->next;
    l3=t1=(struct number*)malloc(sizeof(struct number));    //为l3链表建立头结点
    while(pa!=NULL)
    {
        while(pb!=NULL)                             //比较pa和pb的data

        {                                           //如果不等表2就下移,表1不动
            if(pa->data!=pb->data)
                pb=pb->next;
            else
            {
                t=(struct number*)malloc(sizeof(struct number));   //如果相等接入表3
                t->data=pb->data;
                t1->next=t;
                t1=t;
            }
            pa=pa->next;
            pb=l2->next;
                                                                         //当表2中的所有元素与表1的当前元素比较完了,表1再下移一位,以此类推
        }
       
    }   
   
    print(l1);
    print(l2);
    print(l3);
   
}
搜索更多相关主题的帖子: 链表 交集 
2010-11-06 22:52
遮天云
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:农村一小伙
等 级:贵宾
威 望:12
帖 子:1132
专家分:2671
注 册:2010-6-1
收藏
得分:20 
程序代码:
#include<stdio.h>
#include<stdlib.h>
struct number{
    int data;
    struct number*next ;
};
struct number*creat()                          //创建
{
    struct number*p1,*p2,*sq;
    p2=sq=(struct number*)malloc(sizeof(struct number));
    p1=(struct number*)malloc(sizeof(struct number));
    printf("请输入数据,用零结束\n");//提示用户输入数据
    scanf("%d",&p1->data);
    while(p1->data!=0)
    {p2->next=p1;
    p2=p1;
    p1=(struct number*)malloc(sizeof(struct number));
    scanf("%d",&p1->data);
    }
    p2->next=NULL;//这一句是不能少的
    return sq;
}
struct number *shanchu(struct number *sq)//删除聊表中相同结点的一个
{
    struct number *p=sq->next,*q,*temp;
    q=p->next;
    while(q!=NULL)//删除ha 中相同的元素
    {
        if(p->data==q->data)
        {
            temp=q->next;
            p->next=q->next;
            free(q);
            q=temp;
        }
        else 
        {
            p=q;
            q=p->next;
        }
    }
    return sq;
}
void print(struct number*sq)                 //输出
{
    struct number*p1;
    p1=sq->next;
    while(p1!=NULL)
    {
        printf("%d",p1->data);
        p1=p1->next;
    }
    printf("\n");
}


void main()
{
    struct number*l1,*l2,*l3,*pa,*pb,*t,*t1;
    l1=creat();
    shanchu(l1);
    printf("删除相同元素后的链表:\n");
    print(l1);

    l2=creat();
    shanchu(l2);
    printf("删除相同元素后的链表:\n");
    print(l2);
   pa=l1->next;
   // pb=l2->next;
    l3=t1=(struct number*)malloc(sizeof(struct number));    //为l3链表建立头结点
    while(pa!=NULL)
    {    
         pb=l2->next;//pb指向第一个元素结点
        while(pb!=NULL)                             //比较pa和pb的data
        {                                           //如果不等表2就下移,表1不动
            if(pa->data!=pb->data)
                pb=pb->next;
            else
            {
                t=(struct number*)malloc(sizeof(struct number));   //如果相等接入表3
                t->data=pb->data;
                t1->next=t;
                t1=t;
                pa=pa->next;//指向下一个结点
                if(pa==NULL)
                    break;
                pb=pb->next;

            }
        }
                if(pb==NULL)
            pa=pa->next;//pa指向下一个结点    
                                                                         //当表2中的所有元素与表1的当前元素比较完了,表1再下移一位,以此类推   
    }   
    t1->next=NULL;//这一句你漏掉了
   
   if(l3->next==NULL)
       printf("无交集");
   else
   {
       printf("交集为:\n");
        print(l3);
   }
   
}
我给你优化了一下,但是限定条件是两个链表必须都是非递减的,楼主测试下,如果有什么问题在提出来哈
2010-11-07 09:20
lizjohn
Rank: 1
等 级:新手上路
帖 子:54
专家分:0
注 册:2010-10-28
收藏
得分:0 
回复 2楼 遮天云
#include<stdio.h>
#include<stdlib.h>
struct number{
    int data;
    struct number*next ;
};
struct number*creat()                          
{
    struct number*p1,*p2,*sq;
    p2=sq=(struct number*)malloc(sizeof(struct number));
    p1=(struct number*)malloc(sizeof(struct number));
    printf("请输入数据,用零结束\n");
    scanf("%d",&p1->data);
    while(p1->data!=0)
    {p2->next=p1;
    p2=p1;
    p1=(struct number*)malloc(sizeof(struct number));
    scanf("%d",&p1->data);
    }
    p2->next=NULL;
    return sq;
}
struct number *shanchu(struct number *sq)
{
    struct number *p=sq->next,*q,*temp;
    q=p->next;
    while(q!=NULL)
    {
        if(p->data==q->data)
        {
            temp=q->next;       //这句话是干什么的,我不太明白,但删除了还不行
            p->next=q->next;
            free(q);
            q=temp;   
        }
        else
        {
            p=q;
            q=p->next;              //这里不应该是q=q->next吗
        }
    }
    return sq;
}
void print(struct number*sq)                 
{
    struct number*p1;
    p1=sq->next;
    while(p1!=NULL)
    {
        printf("%d",p1->data);
        p1=p1->next;
    }
    printf("\n");
}


void main()
{
    struct number*l1,*l2,*l3,*pa,*pb,*t,*t1;
    l1=creat();
    shanchu(l1);
    printf("删除相同元素后的链表:\n");
    print(l1);

    l2=creat();
    shanchu(l2);
    printf("删除相同元素后的链表:\n");
    print(l2);
   pa=l1->next;
   
    l3=t1=(struct number*)malloc(sizeof(struct number));   
    while(pa!=NULL)
    {   
         pb=l2->next;
        while(pb!=NULL)                             
        {                                         
            if(pa->data!=pb->data)
                pb=pb->next;
            else
            {
                t=(struct number*)malloc(sizeof(struct number));   
                t->data=pb->data;
                t1->next=t;
                t1=t;
                pa=pa->next;
                if(pa==NULL)
                    break;
                pb=pb->next;

            }
        }
                if(pb==NULL)
            pa=pa->next;   
                                                                        
    t1->next=NULL;
   
   if(l3->next==NULL)
       printf("无交集");
   else
   {
       printf("交集为:\n");
        print(l3);
   }
   
}
谢谢!!!但我还是有些问题不太明白(上面标注处),麻烦你再帮我一下
2010-11-07 12:12
遮天云
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:农村一小伙
等 级:贵宾
威 望:12
帖 子:1132
专家分:2671
注 册:2010-6-1
收藏
得分:0 
这个啊~。我先给你说功能,你自己试着分析,比如你输入1 2 2 3,那么加上这个自定义函数,那么最终输出就是1 2 3 了
2010-11-07 14:04
快速回复:帮我解决一下我的求链表交集的问题
数据加载中...
 
   



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

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