数据结构作业多链表操作之寻找公共节点。

 

 题目要求使用时间复杂度为O(m+n+q)的方法将ABC三个顺序非递减链表中的公共元素打印输出,并要求重复元素只输出一次。

思路就是利用A(三者任选其一),作为结果链表,第一遍遍历A,将重复元素删除只保留一个,然后分别遍历BC,找到三者公共的元素。

最后输出A即可。注意建立链表时要顺序建立!放码子:

#include<iostream> using namespace std; #define hoho printf("/n"); typedef struct jj { int data; struct jj *next,*pre; }pzjj; pzjj *pa,*pb,*pc; pzjj* find(pzjj *link,pzjj *insert)//递归寻找插入位置,第一个参数是要插入的链表的当前位置,第二个是要插入元素的节点 { if(insert->data<link->data)//插入到link前 { if(NULL==link->pre) return link; if(insert->data<link->pre->data) return find(link->pre,insert); } else { if(NULL==link->next) return link; if(insert->data>=link->next->data) return find(link->next,insert); } return link; } pzjj* creat()//建立有序非递减链表,以-1结束 { pzjj *tmp,*head; int n; tmp=NULL; while(scanf("%d",&n),n+1) { head=new pzjj; head->next=head->pre=NULL; head->data=n; if(NULL==tmp) tmp=head; else { tmp=find(tmp,head); if(head->data<tmp->data)//插入到找到的位置之前 { if(NULL!=tmp->pre) { head->next=tmp; tmp->pre->next=head; head->pre=tmp->pre; tmp->pre=head; } else//找到的位置是头结点 { head->next=tmp; tmp->pre=head; head->pre=NULL; } } else//插入到找到的位置之后 { if(NULL!=tmp->next) { tmp->next->pre=head; head->next=tmp->next; head->pre=tmp; tmp->next=head; } else//插入位置是尾节点 { tmp->next=head; head->pre=tmp; head->next=NULL; } } } } while(NULL!=tmp->pre)//寻找链表第一个结点,不是头结点 tmp=tmp->pre; return tmp; } pzjj* merge(pzjj *aa,pzjj *bb,pzjj *cc)//链表合并,删除相同的元素 { pzjj *ta,*tb,*tc,*head,*tail; head=new pzjj; head->next=aa;//为了算法简单,建立一个头结点,只记录链表的起始位置,无数据域 aa=head;//这样aa就变成了头节点,head成了临时节点 ta=aa->next; while(NULL!=ta && NULL!=ta->next)//找到aa链表中重复的元素,删之 { head=ta->next; if(head->data==ta->data) { ta->next=head->next; delete head; } ta=ta->next; } ta->next=NULL;//将aa尾节点指向NULL ta=aa->next;//ta回到aa的开头,但不是头结点 tail=aa;//tail与aa指向同一个地方 tail->next=NULL; tb=bb; tc=cc; while(NULL!=ta) { while(NULL!=tb && ta->data>tb->data)tb=tb->next; while(NULL!=tc && ta->data>tc->data)tc=tc->next; if(ta->data==tb->data && ta->data==tc->data)//找三者的公共元素,像极了快排 { tail->next=ta; tail=ta; ta=ta->next; tail->next=NULL; } else//将不满足条件的节点删除 { head=ta; ta=ta->next; delete head; } } head=aa; aa=aa->next;//因前面将aa变成了头结点,故而结束时将其从新变为第一个节点 delete head; return aa; } int main() { int n; pzjj *ta,*tb,*tc,*merger; ta=creat(); tb=creat(); tc=creat(); /*while(NULL!=ta) { printf("%d ",ta->data); ta=ta->next; } hoho while(NULL!=tb) { printf("%d ",tb->data); tb=tb->next; } hoho while(NULL!=tc) { printf("%d ",tc->data); tc=tc->next; } hoho*/ merger=merge(ta,tb,tc); while(NULL!=merger) { printf("%d ",merger->data); merger=merger->next; } hoho return false; }

注释部分用于查看建立好的链表节点!

你可能感兴趣的:(数据结构作业多链表操作之寻找公共节点。)