C语言程序设计 数据结构
给定两个不带头结点单链表,请用你学过的高级语言,编写程序找出两个链表的公共结点。建议用函数实现。
你得说清楚,公共节点怎么定义?是节点里的值相等,还是节点的地址相同?
总之双循环遍历,逐个比较
供参考:
//【问题描述】给定两个不带头结点单链表,编写算法找出两个链表的公共结点。
//【输入形式】
//四行:
//第一行:一个数字(第一个单链表中的元素个数)
//第二行:第一个单链表中各个结点的值
//第三行:一个数字(第二个单链表中的元素个数)
//第四行:第二个单链表中各个结点的值
//【输出形式】
//两行:
//第一行:两个单链表的公共元素个数
//第二行:依次打印输出各个公共元素
//【样例输入】
//6
//12 5 8 9 -23 16
//4
//16 21 9 3
//【样例输出】
//2
//9 16
//注:若两个链表无公共元素,则输出:
//0
//无公共元素
#include <stdio.h>
#include <malloc.h>
// 链表节点结构
typedef struct Node {
int data;
struct Node* next;
}Node, * LinkList;
// 输出单链表
void show(LinkList L)
{
Node* p = L;
while (p) {
printf("%d ", p->data);
p = p->next;
if (!p) printf("\n");
}
}
// 链表长度
int length(LinkList L)
{
int cnt = 0;
Node* p = L;
while (p) {
cnt++;
p = p->next;
}
return cnt;
}
//找出两个链表的公共结点
LinkList findCommonNodes(LinkList L1, LinkList L2)
{
Node* p1 = L1, * pL = NULL, * L = NULL;
while (p1) {
Node* p2 = L2;
while (p2)
{
if (p1->data == p2->data) {
Node* f = (Node*)malloc(sizeof(Node));
f->next = NULL;
f->data = p2->data;
if (L == NULL)
L = f;
else
pL->next = f;
pL = f;
break;
}
p2 = p2->next;
}
p1 = p1->next;
}
return L;
}
// 创建链表
void createList(LinkList* L)
{
Node* pL = NULL;
int n, i;
scanf("%d", &n);
for (i = 0; i < n; i++) {// 生成链表
Node* p = (Node*)malloc(sizeof(Node));
p->next = NULL;
scanf("%d", &p->data);
if ((*L) == NULL)
(*L) = p;
else
pL->next = p;
pL = p;
}
}
int main()
{
LinkList L1 = NULL, L2 = NULL, L = NULL;
createList(&L1);
createList(&L2);
//show(L1);
//show(L2);
L = findCommonNodes(L1, L2);
if (L == NULL)
printf("0\n无公共元素");
else{
printf("%d\n", length(L));
show(L);
}
return 0;
}