输入形式为四行
第一行一个数字表示第一个单链表中的元素个数
第二行为第一个单链表各个结点的值
第三行为一个数字表示第二个单链表中的元素个数
第四行为第二个单链表各个结点的值
输出为两行
第一行为两个单链表公共元素个数
第二行为依次打印输出各个公共元素
若两个单链表无公共元素,
输出
0
无公共元素
最简单就是直接用较短链表去遍历长链表
这是引用的写法,供参考:
//********************** 引用版 **************
#include <stdio.h>
#include <malloc.h>
// 链表节点结构
typedef struct Node {
int data;
struct Node* next;
}Node, * LinkList;
// 输出单链表
void show(LinkList L)
{
L->data == -1 ? NULL : printf(L->data == 0 ? "%d\n无公共元素" : "%d\n", L->data);
Node* p = L->next;
while (p) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
LinkList findCommonNodes(LinkList L1, LinkList L2)
{
LinkList L = (Node*)malloc(sizeof(Node));
L->data = 0;
L->next = NULL;
Node* p = L1->next, * pL = L;
while (p) {
Node* q = L2->next;
while (q)
{
if (p->data == q->data) {
Node* f = (Node*)malloc(sizeof(Node));
f->next = NULL;
f->data = q->data;
L->data++;
pL->next = f;
pL = f;
break;
}
q = q->next;
}
p = p->next;
}
return L;
}
// 创建链表
void createListFromHead(LinkList& L)
{
Node* pL;
int n, i;
L = (Node*)malloc(sizeof(Node));// 创建头
L->data = -1;
L->next = NULL;
pL = L;
scanf("%d", &n);
for (i = 0; i < n; i++) {// 生成链表
Node* p = (Node*)malloc(sizeof(Node));
p->next = NULL;
scanf("%d", &p->data);
pL->next = p;
pL = p;
}
}
int main()
{
LinkList L1, L2, L = NULL;
createListFromHead(L1);
createListFromHead(L2);
//show(L1);
//show(L2);
show(L = findCommonNodes(L1, L2));
return 0;
}
再提供个纯指针版的:
//************** 指针版: 指针写法 ******************
#include <stdio.h>
#include <malloc.h>
// 链表节点结构
typedef struct Node {
int data;
struct Node* next;
}Node, * LinkList;
// 输出单链表
void show(LinkList L)
{
L->data == -1 ? NULL : printf(L->data == 0 ? "%d\n无公共元素" : "%d\n", L->data);
Node* p = L->next;
while (p) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
LinkList findCommonNodes(LinkList L1, LinkList L2)
{
LinkList L = (Node*)malloc(sizeof(Node));
L->data = 0;
L->next = NULL;
Node* p = L1->next, * pL = L;
while (p) {
Node* q = L2->next;
while (q)
{
if (p->data == q->data) {
Node* f = (Node*)malloc(sizeof(Node));
f->next = NULL;
f->data = q->data;
L->data++;
pL->next = f;
pL = f;
break;
}
q = q->next;
}
p = p->next;
}
return L;
}
// 创建链表
void createListFromHead(LinkList* L)
{
Node* pL;
int n, i;
(*L) = (Node*)malloc(sizeof(Node));// 创建头
(*L)->data = -1;
(*L)->next = NULL;
pL = (*L);
scanf("%d", &n);
for (i = 0; i < n; i++) {// 生成链表
Node* p = (Node*)malloc(sizeof(Node));
p->next = NULL;
scanf("%d", &p->data);
pL->next = p;
pL = p;
}
}
int main()
{
LinkList L1, L2, L = NULL;
createListFromHead(&L1);
createListFromHead(&L2);
//show(L1);
//show(L2);
show(L = findCommonNodes(L1, L2));
return 0;
}