小白今天刚入门数据结构,正在学习《数据结构高分笔记》,其中第35页仿真题目(2)完成情况如下,如有错误,不吝赐教。
题目要求:已知递增有序的单链表A,B,元素个数分别m,n,分别存储一个集合,请设计算法,求出A与B的差集(我这里定义的差集是指除共同元素以外的元素),将结果保存在A表中,保持元素递增有序。
测试结果如下:
由于程序比较基础,不处理内存分配失败情况,没有对错误输入情况进行筛查,默认输入数据均递增有序且合规。
#include
#include
#define m 3
#define n 4
typedef struct Lnode
{
int data;
struct Lnode *next;
}Lnode,*Linklist;//节点类型和指向结构的指针类型
Linklist Creatnode(int temp);
void Creatlist(Linklist L,int x);//x为数据长度
void initlist(Linklist *L);
void printlist(Linklist L,int x);//x为数据长度
void printlist2(Linklist L);
void AchaB(Linklist L1,Linklist L2);
void jointprint(Linklist L1,Linklist L2,int x,int y);//x,y为数据长度
void main ()
{
/*初始化*/
Linklist L1;
Linklist L2;
initlist(&L1);
L1->next=NULL;//初始状态头结点指针指向NULL
initlist(&L2);
L2->next=NULL;//初始状态头结点指针指向NULL
Creatlist(L1,n);
Creatlist(L2,m);
jointprint(L1,L2,n,m);
AchaB(L1,L2);
printf("\n");
}
Linklist Creatnode(int temp)//单节点创建
{
Linklist p;
p=(Linklist)malloc(sizeof(Lnode));
p->data=temp;
p->next=NULL;//新创建的节点指向空
return p;
}
void jointprint(Linklist L1,Linklist L2,int x,int y)//数据输入结果打印
{
printf("构造链表如下:\n");
printlist(L1,x);
printlist(L2,y);
printf("\n");
}
void initlist(Linklist *L)//内存分配
{
*L=(Linklist)malloc(sizeof(Lnode));//等同于**L=返回的指针*p
}
void Creatlist(Linklist L,int x)//链表创建
{
/*创建表*/
Linklist f;
f=L;
printf("现在构造第链表\n");
int temp;
for (int i=0;i
{
printf("请输入第%d个节点值(整数)\n",i+1);
scanf("%d",&temp);
f->next=Creatnode(temp);//这一步完成了节点的内存分配和值的写入
f=f->next;
}
/*创建表*/
//printlist(L);
}
void printlist(Linklist L,int x)//打印单表
{
Linklist print;
print=L->next;
for(int i=0;i
{
printf(" %d ",print->data);
print=print->next;
}
}
void printlist2(Linklist L)//操作结果打印
{
Linklist print;
print=L->next;
for(int i=0;i
{
printf(" %d ",print->data);
print=print->next;
if (print==NULL)break;
}
printf("\n");
}
void AchaB(Linklist L1,Linklist L2)//求差集
{
Linklist p1;
Linklist p2;
Linklist r2;
Linklist r1;
Linklist del;
p1=L1->next;
p2=L2->next;
r2=L2;
r1=L1;
while(p1!=NULL&&p2!=NULL)
{
if(p1->data>p2->data)
{
r2=r2->next;
p2=p2->next;
}
else if (p1->datadata)
{
p1=p1->next;
r1=r1->next;
}
else
{
del=p2;
p2=p2->next;
r2->next=p2;
free (del);
del=p1;
p1=p1->next;
r1->next=p1;
free(del);
if (p1==NULL||p2==NULL)break;
}
}
//至此,差集求完
//下面两个有序链表头插
p1=L1->next;
p2=L2->next;
r2=L2;
r1=L1;
Linklist temp;
while (p1!=NULL&&p2!=NULL)
{
if (p1->data>p2->data)
{
temp=p2;
p2=p2->next;
r2->next=p2;
temp->next=p1;
r1->next=temp;
r1=r1->next;
}
else if (p1->datadata)
{
p1=p1->next;
r1=r1->next;
}
}
if (p1==NULL)
r1->next=L2->next;
printf("两个链表的差集链表构造完毕,结果如下:\n");
printlist2(L1);
}