数据结构——12 删除两个双向链表中相同的节点

来源:互联网 发布:html5数据统计模板 编辑:程序博客网 时间:2024/06/07 02:45

双向链表——删除两个双向链表中相同的节点


双向链表——删除两个双向链表中相同的节点,先找到相同的节点,放入链表same然后两个链表都删除与same相同的节点
这个程序没写好,写成了一坨屎

#include<iostream>using namespace std;struct node       //node结构体,里面有两个个node指针,用来指向上/下一个node对象{int x;node *left;   //指向什么类型的对象,就用什么类型的指针node *right;};node* create(int n)         //创建链表,参数n表示结点的个数,返回类型是结点指针node*{if(n<1)                 //参数检测,链表最少有一个节点{cout<<"error input n!"<<endl;exit(0);}node *head=new node;    //建立头结点node *p=head;           //创建用于往后指的node指针for(int i=1;i<=n;i++){node *temp=new node;      //new一个node指针temp->x=rand()%10;p->right=temp;            //将p的right指向创建的temp,把新节点连接到链表后面temp->left=p;             //temp的left指向p,新节点left指向上一个节点p=temp;                   //将p指向新结点temp,即p移动到下一个节点}p->right=NULL;                //创建完成后,p->right为空,最后一个节点的right位nullhead->right->left=NULL;       //创建完成后,第一个节点的left为nullreturn head;}void display(node *head)         //输出链表{node *p;p=head->right;               //p重新指向头结点后的那个结点,即for循环创建的第一个结点if(p==NULL)cout<<"NULL List";while(p!=NULL)               //输出{cout<<p->x<<"  ";p=p->right;}cout<<endl;}node* findSame(node *head1,node *head2)    //找到相同的节点,放入same链表中{node *p=head1->right;node *s;node *same=new node;                  //要存放数据,所以这里要new一个头节点node *t=same;while(p)                              //外循环遍历{s=head2->right;                   //每次内循环从head2链表第一个节点开始遍历while(s){if(p->x==s->x)                //相等,则存入same链表中{node *temp=new node;temp->x=p->x;t->right=temp;            //右连接temp->left=t;             //左连接t=temp;          //移动t指向现在same的最后一个节点}s=s->right;}p=p->right;}t->right=NULL;                         //same最后一个节点的右面为nullreturn same;}void deleteSame(node *head, node *same)       //删除head链表中与same相同的节点{node *p;node *s=same->right;        //p重新指向头结点后的那个结点,即for循环创建的第一个结点node *temp1,*temp2;while(s)                    //如果head的第一个节点,和same中有相同,则删除,目的是让head的第一个节点与same链表中节点都不同{                           //因为head的头节点可以指向第一个节点,但第一个节点不能指向头结点,这是链表创建时决定的p=head->right;if(p->x==s->x)             {head->right=p->right;      //如果相同,head直接指向相同结点的下一个结点p->right->left=NULL;}s=s->right;}s=same->right;              //从same的第一个结点开始遍历p=head->right;while(s){while(p){if(p->x==s->x)     //这里有一个bug,没有处理左连接p->left->right=p->right;p=p->right;}s=s->right;}}int main(){node *list1,*list2; list1=create(6);       //建立链表display(list1);        //输出显示建立的链表,这里是讯链表,不用输出list2=create(8);       //建立链表display(list2);        //输出显示建立的链表,这里是讯链表,不用输出cout<<endl;node *same=findSame(list1,list2);      //输出相同的节点display(same);cout<<endl;deleteSame(list1,same);deleteSame(list2,same);display(list1);display(list2);return 0;}


0 0
原创粉丝点击