第1章第2节练习题17 使用相同值结形成新单链表
最后更新于:2022-04-01 19:51:14
## 问题描述
> 设A和B是两个单链表(带头结点),其中元素按递增有序。设计一个算法从A和B中公共元素产生单链表C,要求不破坏A,B的结点
## 算法思想
> 本算法实际上和[第1章第2节练习题16 归并并逆序单链表](http://blog.csdn.net/u013595419/article/details/50510558)并没有太大的区别,同样对两张链表进行遍历,对于具有相同值的结点进行一次复制,然后将复制出来的新节点采用尾插法建立单链表的方式形成新的单链表。
## 算法描述
~~~
LinkList CreatNew(LNode *head1, LNode *head2, LNode *head)
{
LNode *p=head1->next;
LNode *q=head2->next;
LNode *r=head;
LNode *L;
while(p&&q){
if(p->data==q->data){
L=(LNode*)malloc(sizeof(LNode));
L->data=p->data;
r->next=L;
r=L;
p=p->next;
q=q->next;
}else if(p->datadata){
p=p->next;
}else{
q=q->next;
}
}
r->next=NULL;
return head;
}
~~~
具体代码见附件。
## 附件
~~~
#include
#include
typedef int ElemType;
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode, *LinkList;
LinkList CreatList(LNode*);
LinkList CreatNew(LNode*,LNode*,LNode*);
void Print(LNode*);
int main(int argc, char* argv[])
{
LNode *head1;
head1=(LNode*)malloc(sizeof(LNode));
head1->next=NULL;
head1=CreatList(head1);
LNode *head2;
head2=(LNode*)malloc(sizeof(LNode));
head2->next=NULL;
head2=CreatList(head2);
LNode *head;
head=(LNode*)malloc(sizeof(LNode));
head=CreatNew(head1, head2, head);
Print(head1);
Print(head2);
Print(head);
return 0;
}
//尾插法建立单链表
LinkList CreatList(LNode* head)
{
LNode *L;
LNode *r=head;
ElemType x;
scanf("%d",&x);
while(x!=999){
L=(LNode*)malloc(sizeof(LNode));
L->data=x;
r->next=L;
r=L;
scanf("%d",&x);
}
return head;
}
//查找公共结点
LinkList CreatNew(LNode *head1, LNode *head2, LNode *head)
{
LNode *p=head1->next;
LNode *q=head2->next;
LNode *r=head;
LNode *L;
while(p&&q){
if(p->data==q->data){
L=(LNode*)malloc(sizeof(LNode));
L->data=p->data;
r->next=L;
r=L;
p=p->next;
q=q->next;
}else if(p->datadata){
p=p->next;
}else{
q=q->next;
}
}
r->next=NULL;
return head;
}
//打印所有结点
void Print(LNode *head)
{
LNode *p=head->next;
while(p){
printf("%4d",p->data);
p=p->next;
}
printf("\n");
}
~~~
';