c语言求两个有序表合成差集代码,两个有序链表求差集,合并为一个有序链表...

小白今天刚入门数据结构,正在学习《数据结构高分笔记》,其中第35页仿真题目(2)完成情况如下,如有错误,不吝赐教。

题目要求:已知递增有序的单链表A,B,元素个数分别m,n,分别存储一个集合,请设计算法,求出A与B的差集(我这里定义的差集是指除共同元素以外的元素),将结果保存在A表中,保持元素递增有序。

测试结果如下:

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

由于程序比较基础,不处理内存分配失败情况,没有对错误输入情况进行筛查,默认输入数据均递增有序且合规。

#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);

}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值