4 集合的操作
作者: Turbo时间限制: 1S章节: 链表
问题描述
输入A、B、C、D四个集合(集合中无重复元素,且元素值都大于0),分别存储在不带头结点的链表中。
本程序先将四个集合执行以下操作:
对A、B、C、D分别进行升序排序;(该功能已实现,见函数sort)。
做A=A+B操作:先执行两个有序链表A和B的合并,并仍然保持有序,结果存储在A中,然后删除重复元素;(该功能已实现,见函数merge和purge)。
做A=A-C操作:将C中出现的元素从A中删除;(该功能已实现,见函数subtract)。
对D中出现的元素,逐一到A中查询:
如果在A中存在,则从A中删除
如果在A中不存在,则将元素添加到A中,并保持链表A有序。
请编写函数fun的函数体实现本功能。
5. 输出集合A中的元素。(该功能已实现,见函数displayLink)。
需要编写的函数的原型如下:
struct student* fun(struct student* L1, struct student* L2)
形参:
L1:传入的第一个集合,程序中将传入A集合的链表头指针
L2:传入的第二个集合,程序中将传入D集合的链表头指针
返回值:
返回第一个集合的链表的头指针
程序部分代码如下
#include <stdio.h>
#include <stdlib.h>
struct student
{
int num;
struct student *next;
};
struct student *createByTail()
{
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始终指向最后一个结点(即尾指针)
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-