两个有序链表求差集,合并为一个有序链表

来源:互联网 发布:淘宝借贷额度怎么提高 编辑:程序博客网 时间:2024/05/18 01:05


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


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

测试结果如下:





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


#include <stdio.h>#include <stdlib.h>#define m 3#define n 4typedef 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;//初始状态头结点指针指向NULLinitlist(&L2);L2->next=NULL;//初始状态头结点指针指向NULLCreatlist(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<x;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<x;i++){printf(" %d ",print->data);print=print->next;}}void printlist2(Linklist L)//操作结果打印{Linklist print;print=L->next;for(int i=0;i<(2*n);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->data<p2->data){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->data<p2->data){p1=p1->next;r1=r1->next;}}if (p1==NULL)r1->next=L2->next;printf("两个链表的差集链表构造完毕,结果如下:\n");printlist2(L1);}



0 0