两个单链表的交集

条件:必须为两个有序单链表

算法思想:首先创建一个头结点,什么都不存放。
                再对两个单链表进行逐个比较, 出口条件为指向两个单链表的指针都不为空。(1)如果相等,创建一个结点,将数值存入,两个单链表的指针都向后一个移动。(2)如果不相等,数值大的单链表的指针向后移动,直到相等为止。

代码:

           

#include <stdio.h>
#include <stdlib.h>
typedef int datatype;
typedef struct node_list{
    datatype infor;
    struct node_list *next;
}node;

//  单链表的创建,带头结点。
node * creat1()
{
    node *s,*tail;
    datatype x;
    node * head=(node *)malloc(sizeof(node));
    head->next=NULL;
    tail=head;
    printf("Please enter an information \n");
    scanf("%d",&x);
    while( x!=-1)
    {
        s=(node *)malloc(sizeof(node));
        s->infor=x;
        tail->next=s;
        tail=s;
        scanf("%d",&x);
    }
    tail->next=NULL;
    return head;
}
//  单链表的遍历
 void display(node * head)
 {   node * p;
     p=head;
     while(p!=NULL)
     {
         printf("%5d",p->infor);
         p=p->next;
     }
     printf("\n");
 }
 void display1(node * head)
 {   node * p;
     p=head->next;
     while(p!=NULL)
     {
         printf("%5d",p->infor);
         p=p->next;
     }
     printf("\n");
 }

//核心功能函数,找出交集
node *Intersect(node *head1,node *head2)
{
  node *p1=head1,*p2=head2;
  node *head,*p,*q;
  head = (node *)malloc(sizeof(node));  //创建带头结点的单链表。
  head->next = NULL;
  p = head;
  while( p1 && p2 )
  {
    if (p1->infor == p2->infor)
     {
      q = (node*)malloc(sizeof(node));
      q->infor = p1->infor;
      q->next = NULL;
      p->next = q;
      p = q;
      p1 = p1->next;
      p2 = p2->next;
     }
    else if (p1->infor < p2->infor)
     {
       p1 = p1->next;
      }
   else
   {
     p2 = p2->next;
   }
  }
    return head;
}
  int main()
 {
     node * head1,*head2,*head3;
     head1=creat1();
     display1(head1);
     head2=creat1();
     display1(head2);
     head3=Intersect(head1,head2);
     puts("The intersection of two single chain tables is ");
     display1(head3);
     return 0;
 }


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值