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

    xiaoxiao2026-06-10  12

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

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

    测试结果如下:

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

    #include <stdio.h> #include <stdlib.h> #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<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); }

    转载请注明原文地址: https://ju.6miu.com/read-1310371.html
    最新回复(0)