问题描述 :
使用带头结点的单链表编程:
有两个有序序列,分别表示两个集合。
求它们的交集并输出。
注意:这里要利用到“有序”的特性。
输入说明 :
第一行输入序列A的信息:
第一个整数n(0<=n<=100),表示共有n个元素,其后有n个整数,表示n个元素的数据
第一行输入序列B的信息:
第一个整数n(0<=n<=100),表示共有n个元素,其后有n个整数,表示n个元素的数据
注:两个序列输入时保证有序
输出说明 :
输出交集的元素序列,输出格式见范例。
如果交集为空,则输出“head-->tail”
输入范例 :
4 1 3 5 7
4 1 4 5 8
输出范例 :
head-->1-->5-->tail
#include <iostream>
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;
p2 = head2;
while (1)
{
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 || p2->num>p1->num)
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;
}
该程序实现了使用带头结点的单链表处理两个有序序列的交集问题。首先读取两个有序序列的元素,然后通过比较序列中的元素找到交集,并输出结果。如果交集为空,则输出'head-->tail'。示例输入为两个序列41357和41458,输出为'head-->1-->5-->tail'。
651

被折叠的 条评论
为什么被折叠?



