基于《数据结构》C语言版(清华严蔚敏)
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
//----- 线性表的单链表存储结构-----
typedef struct LNode{
int data;
struct LNode *next;
}LNode, *LinkList; //这里给结构体起个别名
typedef int Status;
Status ListInsert_L(LinkList &L,int i,int e){ //在带头结点的单链线性表L中第i个位置之前插入元素e(前插法)。
LinkList p;
LinkList s;
p=L; //L的地址传送给了p。
int j = 0;
while(p&&j<i-1){ //寻找第i-1个结点。
p=p->next;
j++;
}
if(!p||j>i-1) return 0; //i小于1或者大于表长加1。
s=(LinkList)malloc(sizeof(LNode));//生成新结点。
s->data=e; //插入L中。
s->next=p->next;
p->next=s;
return 1;
}
Status intersect(LinkList &K,LinkList &L)//建立查找K链表与L链表的交集部分并输出的函数。
{
LinkList P;//建立链表指针P。
P=L;//将L的基址赋给P,相当于多了一个打开基址针L的钥匙。
while(K){//若K不为NULL,循环。
while(L){//若L不为NULL,循环。
if(K->data==L->data){
cout<<L->data<<endl;
}
L=L->next;//就是因为L不在指向基地址,所以才提前记录L得基址给了P。
}
K=K->next;//K继续指向下一个结点。
L=P;//又重新把基址给了L。这样L又重新指向了基地址。
}
return 0;
}
int main() {
LinkList A,B;
A=(LinkList)malloc(sizeof(LNode)); //A链表初始化申请空间建立新的结点。
B=(LinkList)malloc(sizeof(LNode));
A->data=1;
B->data=5;
A->next=NULL;//起初为空表,但头结点data可以存数据。
B->next=NULL;
for(int i=2;i<=6;i++){
ListInsert_L(A,1,i);//调用插入函数,内部整个A链表的数据从头到尾依次是6,5,4,3,2,1。
}
for(int i=6;i<=9;i++)
{
ListInsert_L(B,1,i);//调用插入函数,内部整个B链表的数据从头到尾依次是9,8,7,6,5。
}
cout<<"A与B的交集部分:"<<endl;
intersect(A,B);
return 0;
}