问题描述 :
使用带头结点的单链表编程:
有两个有序序列,分别表示两个集合。
求它们的交集并输出。
注意:这里要利用到“有序”的特性。
输入说明 :
第一行输入序列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 <stdio.h> #include <stdlib.h> #include <iostream> using namespace std; struct student { int num; struct student* next; }; //无头节点 struct student* createByTail(int size) { struct student* head; struct student* p1, * p2; int n; n = 0; p1 = p2 = (struct student*)malloc(sizeof(struct student)); scanf("%d", &p1->num); head = NULL; //首先置链表为空链表 while (p1->num != -1) //num为-1,意味着用户输入结束 { n = n + 1; if (n == 1) //创建第一个结点 head = p1; else p2->next = p1; p2 = p1; //p2始终指向最后一个结点(即尾指针) if (size == n)break; p1 = (struct student*)malloc(sizeof(struct student)); //p1指向新结点 scanf("%d", &p1->num); } p2->next = NULL; //切记:最后一个结点的next赋值为NULL return head; } //输出链表中的信息(num) void displayLink(struct student* head) { struct student* p; p = head; printf("head-->"); while (p != NULL) { printf("%d-->", p->num); p = p->next; } printf("tail "); } //求L1 L2的交集 L1 L2有序 struct student* intersection(struct student* L1, struct student* L2) { struct student* res = NULL, * tail = NULL, * p1 = L1, * p2 = L2; while (p1 && p2) { if (p1->num == p2->num) { if (!res) { res = p1; tail = p1; } else { tail->next = p1; tail = p1; } p1 = p1->next; p2 = p2->next; } else if (p1->num < p2->num) p1 = p1->next; else p2 = p2->next; } if(tail)tail->next = NULL; return res; } int main() { struct student* headA, * headB; int i = 0, n; scanf("%d", &n); headA = createByTail(n); //displayLink(headA); scanf("%d", &n); headB = createByTail(n); //displayLink(headB); displayLink(intersection(headA, headB)); return 0; }