目录
题目
设A和B是两个单链表(带头结点),其中元素递增有序。设计一个算法从A和B中公共元素产生单链表C,要求不破坏A、B的结点。
核心代码
//查找公共元素并且放入新的表C当中
void Find_common_element(LinkList A,LinkList B,LinkList C){
LNode *p=A->next;
LNode *q=B->next;
LNode *r=C;
r=C;
while(p!=NULL&&q!=NULL){
if(p->data<q->data){
p=p->next;
}else if(p->data>q->data){
q=q->next;
}else{
LNode *s=(LNode *)malloc(sizeof(LNode));
s->data=p->data;
r->next=s;
r=s;
p=p->next;
q=q->next;
}
}
r->next=NULL;
}
完整代码
//单链表删除x
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
typedef struct LNode
{
int data; //数据域
struct LNode *next; //指针域
}LNode,*LinkList;
//初始化单链表,建立头结点
bool InitList(LinkList A,LinkList B,LinkList C){
A=(LNode *)malloc(sizeof(LNode));
A->next=NULL;
B=(LNode *)malloc(sizeof(LNode));
B->next=NULL;
C=(LNode *)malloc(sizeof(LNode));
C->next=NULL;
return true;
}
//采用尾插法建立一个单链表A
LinkList List_TailInsert1(LinkList &A){
int x;
A=(LNode *)malloc(sizeof(LNode));
LNode *s,*r=A;
printf("请输入你想插入A的第一个值(1—10000):");
scanf("%d",&x);
while(x!=9999){
s=(LNode *)malloc(sizeof(LNode));
s->data=x;
r->next=s;
r=s;
printf("想插入A的下一个值:");
scanf("%d",&x);
}
r->next=NULL;
return A;
}
LinkList List_TailInsert2(LinkList &B){
int x;
B=(LNode *)malloc(sizeof(LNode));
LNode *s,*r=B;
printf("请输入你想插入B的第一个值(1—10000):");
scanf("%d",&x);
while(x!=9999){
s=(LNode *)malloc(sizeof(LNode));
s->data=x;
r->next=s;
r=s;
printf("想插入B的下一个值:");
scanf("%d",&x);
}
r->next=NULL;
return B;
}
//查找公共元素并且放入新的表C当中
void Find_common_element(LinkList A,LinkList B,LinkList C){
LNode *p=A->next;
LNode *q=B->next;
LNode *r=C;
r=C;
while(p!=NULL&&q!=NULL){
if(p->data<q->data){
p=p->next;
}else if(p->data>q->data){
q=q->next;
}else{
LNode *s=(LNode *)malloc(sizeof(LNode));
s->data=p->data;
r->next=s;
r=s;
p=p->next;
q=q->next;
}
}
r->next=NULL;
}
// 输出函数
void print1(LinkList A) {
LNode* p = A->next; // 从头节点开始遍历
if (p == NULL) {
printf("链表为空。\n");
} else {
printf("此时单链表A中的数据有: ");
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
}
int main(){
LinkList A;
LinkList B;
LinkList C;
InitList(A,B,C);
List_TailInsert1(A);
List_TailInsert2(B);
print1(A);
print1(B);
//查找公共元素
Find_common_element(A,B,C);
print1(C);
return 0;
}
示例
请输入你想插入A的第一个值(1—10000):2
想插入A的下一个值:3
想插入A的下一个值:4
想插入A的下一个值:5
想插入A的下一个值:6
想插入A的下一个值:9999
请输入你想插入B的第一个值(1—10000):3
想插入B的下一个值:7
想插入B的下一个值:8
想插入B的下一个值:9
想插入B的下一个值:10
想插入B的下一个值:9999
链表中的数据有: 2 3 4 5 6
链表中的数据有: 3 7 8 9 10
链表中的数据有: 3