条件:必须为两个有序单链表
算法思想:首先创建一个头结点,什么都不存放。
再对两个单链表进行逐个比较,
出口条件为指向两个单链表的指针都不为空。(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;
}