PTA-数据结构 两个有序链表序列的交集
7-3 两个有序链表序列的交集 (20 分)
已知两个非降序链表序列S1与S2,设计函数构造出S1与S2的交集新链表S3。
输入格式:
输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。数字用空格间隔。
输出格式:
在一行中输出两个输入序列的交集序列,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL
。
输入样例:
1 2 5 -1
2 4 5 8 10 -1
输出样例:
2 5
//库函数头文件包含
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
//函数状态码定义
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef int ElemType;
typedef struct LNode{
ElemType data;
struct LNode* next;
}LNode,*Linklist;
Status InitList(Linklist &L)
{
L = (Linklist)malloc(sizeof(LNode));
if(!L)
exit(OVERFLOW);
L->next = NULL;
return OK;
}
void InsertList(Linklist &L)
{
ElemType e;
Linklist p = L;
Linklist curp;
while(scanf("%d",&e) && e!=-1)
{
curp = (Linklist)malloc(sizeof(LNode));
curp->data = e;
curp->next = NULL;
p->next = curp;
p = p->next;
}
}
void PrintList(Linklist &L)
{
if(!L)
{
printf("NULL\n");
return ;
}
Linklist p = L->next;
int flag = 0;
while(p)
{
if(!flag)
{
printf("%d",p->data);
flag++;
}
else
printf(" %d",p->data);
p = p->next;
}
printf("\n");
}
Linklist IntersectList(Linklist s1,Linklist s2)
{
Linklist p1 = s1->next;
Linklist p2 = s2->next;
if(!p1 || !p2)
return NULL;
Linklist s3 = s1;
Linklist p3 = s3;
while(p1 && p2)
{
if(p1->data == p2->data)
{
p3->next = p1;
p1 = p1->next;
p2 = p2->next;
p3 = p3->next;
p3->next = NULL;
}
else if(p1->data < p2->data)
p1 = p1->next;
else if(p1->data > p2->data)
p2 = p2->next;
}
if(p3==s3)
return NULL;
return s3;
}
int main()
{
Linklist s1,s2;
InitList(s1);
InsertList(s1);
InitList(s2);
InsertList(s2);
Linklist s3 = IntersectList(s1,s2);
PrintList(s3);
return 0;
}
还没有评论,来说两句吧...