题目:
设计一个函数
void Intersection (List La, List Lb)
其功能是求Lb和La的交集,且将交集的结果置于La中,其中La和Lb的元素均为非递减有序排列,求交集后的La的元素也为非递减有序排列。La和Lb是带头结点的单向链表。
其中List是如下结构体:
typedef struct T_Node{
int d;
struct T_Node *next;
} Node, *List;
如下的main函数执行后
//创建头指针为la, lb的两个链表
void createlink(List *pla, List *plb)
{
int i;
Node *p;
*pla = (Node *)malloc(sizeof(Node)); //创建头结点
p = *pla;
for(i = 1; i <=10;i++)
{
p->next = (Node *)malloc(sizeof(Node));
p = p->next;
p->d = i*2;
p->next = NULL;
}
*plb = (Node *)malloc(sizeof(Node)); //创建头结点
p = *plb;
for(i = 1; i <= 8;i++)
{
p->next = (Node *)malloc(sizeof(Node));
p = p->next;
p->d = i+6;
p->next = NULL;
}
}
void main()
{
int i;
List la, lb;
Node *p;
createlink(&la, &lb);
Intersection (la, lb);
p = la->next;
while(p!=NULL)
{
printf("%4d",p->d);
p = p->next;
}
printf("\n");
}
执行的结果为
8 10 12 14
代码:
#include <stdio.h>
#include <malloc.h>
typedef struct T_Node{
int d;
struct T_Node *next;
} Node, *List;
void Intersection (List La, List Lb)
{
Node *p, *q, *r, *s;
p = La->next;
q = Lb->next;
r = La;
while (p && q) {
if (p->d == q->d) {
p = p->next;
q = q->next;
r = r->next;
} else if (p->d > q->d){
q = q->next;
} else {
r->next = p->next;
s = p;
p = p->next;
free(s);
}
}
r->next = NULL;
while (p) {
s = p;
//printf("%d\n", p->d);
p = p->next;
free(s);
}
//};
}
void createlink(List *pla, List *plb)
{
int i;
Node *p;
*pla = (Node *)malloc(sizeof(Node)); //?????
p = *pla;
for(i = 1; i <=10;i++)
{
p->next = (Node *)malloc(sizeof(Node));
p = p->next;
p->d = i*2;
p->next = NULL;
}
*plb = (Node *)malloc(sizeof(Node)); //?????
p = *plb;
for(i = 1; i <= 8;i++)
{
p->next = (Node *)malloc(sizeof(Node));
p = p->next;
p->d = i+6;
p->next = NULL;
}
}
int main()
{
int i;
List la, lb;
Node *p;
createlink(&la, &lb);
Intersection (la, lb);
p = la->next;
while(p!=NULL)
{
printf("%4d",p->d);
p = p->next;
}
printf("\n");
}