您的位置:首页 > 编程语言 > C语言/C++

假设以两个元素依值递增有序排列的线性表A和B分别表示两个集合,现要求另辟空间构成一个顺序链表C

2017-12-14 16:23 726 查看
题目有点长,反正是求交集是吧,网上的方法我看了,一般般,都是不知道怎么想出来的,晦涩难懂,这里介绍一下我自己的方法。

取A和B的交集就是取A和B中相同的元素,方法是从B中第一个元素开始,在A中依次查看是否有与他相同的元素,有就把这个值在C表中创建,没有的话接着B表下一次元素继续在A表中查看,直到B表全部元素都用上为止

要注意的是,题目要求另辟空间,也就是说不要动A和B表,网上的方法说什么把A和B合并,然后去除多余的元素,一看就有问题,题目都没理解清楚就做题。好了,下面是我的代码。

#include<stdio.h>
#include<assert.h>
#include<malloc.h>
#define Elemtype int

typedef struct SList
{
Elemtype data;
struct SList *next;
}Node;

Node* _buynode(Elemtype x);
void initial(Node **head);
void push_back(Node **head,Elemtype x);
void show(Node *head);
Node* intersec(Node *ha,Node *hb);

int main()
{
Node *ha,*hb,*hc;
initial(&ha);
initial(&hb);

printf("构建有序链表a(-1结束)\n");
int x;
while(1)
{
scanf("%d",&x);
if(x==-1)
break;
push_back(&ha,x);
}
printf("这是链表a>>");
show(ha);

printf("构建有序链表b(-1结束)\n");
while(1)
{
scanf("%d",&x);
if(x==-1)
break;
push_back(&hb,x);
}
printf("这是链表b>>");
show(hb);

printf("取交集后的链表\n");
hc=intersec(ha,hb);
show(hc);

return(1);
}

Node* _buynode(Elemtype x)
{//本算法的功能是创建一个节点,其数据域赋值为x,并且返回该节点的指针
Node *s=(Node*)malloc(sizeof(Node));
assert(s!=NULL);

s->data=x;
s->next=NULL;
return(s);
}

void push_back(Node **head,Elemtype x)
{//本算法的前提是链表已经初始化
//本算法的功能是在链表的尾部插入一个新的节点
Node *p=*head;
while(p->next!=NULL)
{
p=p->next;
}//p指向尾节点

Node *s=_buynode(x);
s->next=p->next;
p->next=s;
(*head)->data++;//表长加一
}

void initial(Node **head)
{//本算法的功能的是初始化一个单链表的头指针
(*head)=(Node*)malloc(sizeof(Node));
assert((*head)!=NULL);

(*head)->data=0;//表长为0
(*head)->next=NULL;
}

void show(Node *head)
{//本算法的前提是链表中至少有一个元素
//本算法的功能是依次显示链表中的数据
if(head->data==0)
return;//表长的合法性判断

Node *p=head->next;

while(p!=NULL)
{
printf("%d-->",p->data);
p=p->next;
}
printf("Null.\n");
}

Node*
4000
intersec(Node *ha,Node *hb)
{//本算法的前提是链表a和b的元素都是按值递增有序排列的,并且都是一个集合
//本算法的功能是另辟一个链表C,C中的元素是链表a和b的交集,算法结束后,会返回链表
//C的头指针
Node *hc,*pa,*pb;
initial(&hc);
pa=ha->next;
pb=hb->next;

while(pb!=NULL)//b链表中的元素没有遍历完
{
while(pa!=NULL && pa->data<pb->data)
pa=pa->next;
if(pa!=NULL && pa->data==pb->data)
{
Node *s=_buynode(pb->data);
Node *p=hc;
while(p->next!=NULL)
p=p->next;//寻找hc的尾节点
s->next=p->next;
p->next=s;//尾部插入
hc->data++;//表长加一
}
pb=pb->next;
pa=ha->next;
}
return(hc);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐