求大神帮忙解释下这个程序里的算法,,感激谢谢

回家uii 2015-12-27 03:04:33
#include<iostream>
#include<string.h>
#include<malloc.h>
using namespace std;
typedef struct LNode//定义单链表结点
{
char data;
struct LNode *next;
}linklist;
void creatlist(linklist *&l,char a[],int n)//(后插法)建立单链表
{
linklist *s,*r;int i;
l=(linklist*)malloc(sizeof(linklist));//给头结点分配空间
l->next=NULL;
r=l;

for(i=0;i<n;i++)
{
s=(linklist*)malloc(sizeof(linklist));
s->data=a[i];
r->next=s;
r=s;
}
r->next=NULL;
}
void creat2(linklist*&head)//对链表元素排序
{
linklist*p=head->next,*q,*r;
if(p!=NULL)
{
r=p->next;
p->next=NULL;
p=r;
while(p!=NULL)
{ r=p->next;
q=head;
while(q->next!=NULL&&q->next->data<p->data)
q=q->next;
p->next=q->next;
q->next=p;
p=r;
}
}
}
void shanchu(linklist *&head)//删除链表中重复元素
{
linklist*p=head->next,*r=head,*q,*f;
while(p->next)
{
if(p->data==p->next->data||((p->next->data>'z')||(p->next->data<'a')))
{
q=p->next;
p->next=q->next;
free(q);
}
else
p=p->next;
}
if(r->next->data>'z'||r->next->data<'a')
{
f=r->next;
r->next=f->next;
free(f);
}
}
void bing(linklist *ha,linklist *hb,linklist *hc)//求并集
{
linklist*pa,*pb,*pc;
pa=ha->next;
while(pa!=NULL)
{
pc=(linklist*)malloc(sizeof(linklist));
pc->data=pa->data;
pc->next=hc->next;
hc->next=pc;
pa=pa->next;
}
pb=hb->next;
while (pb!=NULL)
{
pa=ha->next;
while((pa!=NULL)&&(pa->data!=pb->data))
{
pa=pa->next;
if(pa==NULL)
{
pc=(linklist*)malloc(sizeof(linklist));
pc->data=pb->data;
pc->next=hc->next;
hc->next=pc;
}
}
pb=pb->next;
}
}
void jiao(linklist *ha,linklist*hb,linklist*&hc)//求交集
{
linklist*pa=ha->next,*pb,*s,*tc;
hc=(linklist*)malloc(sizeof(linklist));
tc=hc;
while (pa)
{
pb=hb->next;
while(pb&&pb->data<pa->data)
pb=pb->next;
if(pb&&pb->data==pa->data)
{
s=(linklist*)malloc(sizeof(linklist));
s->data=pa->data;
tc->next=s;
tc=s;
}
pa=pa->next;
}
tc->next=NULL;
}
void cha(linklist *ha,linklist*hb,linklist*&hc)//求差集
{
linklist*pa=ha->next,*pb,*s,*tc;
hc=(linklist*)malloc(sizeof(linklist));
tc=hc;
while (pa)
{
pb=hb->next;
while(pb&&pb->data<pa->data)
pb=pb->next;
if(!(pb&&pb->data==pa->data))
{
s=(linklist*)malloc(sizeof(linklist));
s->data=pa->data;
tc->next=s;
tc=s;
}
pa=pa->next;
}
tc->next=NULL;
}
void dislist(linklist *l)//输出
{
linklist *p=l->next;
while(p!=NULL)
{
cout<<p->data;
p=p->next;
}
cout<<endl;
}
int main()
{
linklist *ha,*hb,*hc;
char a[100],b[100];
int la,lb,x;
cout<<"请输入集合Set1:";
cin.getline(a,100);
//cin.getline(),该函数一次读取多个字符。
cout<<"请输入集合Set2:";
cin.getline(b,100);
la=strlen(a);
//strlen(). string.函数库中的函数。计算字符数组中元素的数量
lb=strlen(b);
creatlist(ha,a,la);
creatlist(hb,b,lb);
creat2(ha);
creat2(hb);
shanchu(ha);
shanchu(hb);
cout<<endl;
cout<<"[1] 输出有序集合(删除重复元素):"<<endl;
cout<<"[2] 求两集合的交集Set1∩Set2:"<<endl;
cout<<"[3] 求两集合的并集Set1USet2:"<<endl;
cout<<"[4] 求两集合的差集Set1-Set2:"<<endl;
cout<<endl;
while(x!=0)
{ cout<<endl;
cout<<"请选择要进行的运算序号(选0将退出):"<<endl;
cin>>x;
switch(x)
{
case 1:
cout<<"有序集合Set1:";dislist(ha);
cout<<"有序集合Set2:";dislist(hb);
break;
case 2:
jiao(ha,hb,hc);
cout<<"两集合的交集Set1∩Set2=";dislist(hc);
break;
case 3:
bing(ha,hb,hc);
creat2(hc);
shanchu(hc);
cout<<"两集合的并集Set1USet2=";dislist(hc);
break;
case 4:
cha(ha,hb,hc);
cout<<"两集合的差集Set1-Set2=";dislist(hc);
break;
}
}
return 0;
}
...全文
105 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2015-12-28
  • 打赏
  • 举报
回复
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒:再牛×的老师也无法代替学生自己领悟和上厕所! 单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧