问题描述 :
使用带头结点的单链表编程:
有两个序列,分别表示两个集合。
求它们的交集并输出。
输入说明 :
第一行输入序列A的信息:
第一个整数n(0<=n<=100),表示共有n个元素,其后有n个整数,表示n个元素的数据
第一行输入序列B的信息:
第一个整数n(0<=n<=100),表示共有n个元素,其后有n个整数,表示n个元素的数据
输出说明 :
输出交集的元素序列,输出格式见范例。
如果交集为空,则输出“head-->tail”
交集里的元素顺序,依照其在序列A中的顺序。
比如:
序列:
A:5 3 2 7
B:1 3 5 8
则交集为5和3,因为在序列A中,5在3的前面,所以在交集里5也在3的前面。
输入范例 :
4 5 3 2 7
4 1 3 5 8
输出范例 :
head-->5-->3-->tail
解题思路:
熟练使用链表的操作罢了,没有什么难度,在上一题基础上复制粘贴修改就可以解决了。
代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <vector>
using namespace std;
struct ListNode
{
int num;
ListNode* next = NULL;
};
int lenght(ListNode* head)
{
ListNode* p1;
if (head == NULL)
return 0;
p1 = head;
int l = 0;
while (1)
{
l++;
if ((p1->next != NULL))
p1 = p1->next;
else
break;
}
return l;
}
void output(ListNode* head)
{
ListNode* p1;
p1 = head;
cout << "head-->";
while (1)
{
cout << p1->num << "-->";
if ((p1->next != NULL))
p1 = p1->next;
else
break;
}
cout << "tail";
cout << endl;
return;
}
int main()
{
int i, j;
ListNode* head1, * head2, * head3, * p1, * p2, * p3, * p4;
head1 = NULL;
p2 = NULL;
int n, where, num;
cin >> n;
for (i = 0; i < n; i++)
{
cin >> num;
p1 = new ListNode;
p1->num = num;
if (i == 0)
head1 = p1;
else
p2->next = p1;
p2 = p1;
}
head2 = NULL;
cin >> n;
for (i = 0; i < n; i++)
{
cin >> num;
p1 = new ListNode;
p1->num = num;
if (i == 0)
head2 = p1;
else
p2->next = p1;
p2 = p1;
}
if (lenght(head1) == 0 || lenght(head2) == 0)
{
cout << "head-->tail" << endl;
return 0;
}
head3 = NULL;
p1 = head1;
p4 = NULL;
while (1)
{
p2 = head2;
while (1)
{
if (p2 -> num == p1->num)
{
p3 = new ListNode;
p3->num = p1->num;
if (head3==NULL)
head3 = p3;
else
p4->next = p3;
p4 = p3;
break;
}
if (p2->next == NULL)
break;
else
p2 = p2->next;
}
if (p1->next == NULL)
break;
else
p1 = p1->next;
}
if(head3!=NULL)
output(head3);
else
cout << "head-->tail" << endl;
return 0;
}