数据结构——11 有序双向链表中插入节点

来源:互联网 发布:java选择排序代码 编辑:程序博客网 时间:2024/06/05 00:19

双向链表——有序双向链表中插入节点


双向链表——有序双向链表中插入节点

#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()%100;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;}void sort(node *head){node *p,*s;p=head->right;               //p重新指向头结点后的那个结点,即for循环创建的第一个节点int temp;                    //用于交换的临时变量while(p)                     //外循环从头结节后的第一个节点开始{s=p->right;              //内循环从p的后一个结点开始while(s){if(p->x > s->x)      //只交换结点里面的x,结点不动{temp=p->x;p->x=s->x;s->x=temp;}s=s->right;          //内循环后移}p=p->right;              //外循环后移}}void insert(node *head, int n)     //直接将数n插入到链表head的适当位置{node *p,*s;p=head;                        //p重新指向头结点后的那个结点,即for循环创建的第一个节点while(p->right){if(p->right->x > n)        //在有序列表中找到第一个比n大的节点,在它前面插入就行{node *temp=new node;temp->x=n;s=p->right;           //用于反向连接的临时node指针stemp->right=p->right;p->right=temp;        //插入适当位置,正向连接链表s->left=temp;         //反向连接链表temp->left=p;break;}p=p->right;}if(p->right==NULL)            //如果链表最后一个数还比n小,则直接放在链表最后{node *temp=new node;temp->x=n;p->right=temp;            //连接上新来的最后一个节点temp->right=NULL;         //right指针为nulltemp->left=p;             //反向连接}}void insert1(node *head, int n)    //既然有排序,就直接将插入的节点连接到第一个节点,然后排序{node *s,*p=head;                        //p重新指向头结点后的那个结点,即for循环创建的第一个节点node *t=new node;t->x=n;s=p->right;        //用于反向连接的临时node指针st->right=p->right; //插入适当位置,正向连接链表p->right=t;       s->left=t;         //反向连接链表t->left=p;sort(head);        //借助上面的排序}int main(){node *list; list=create(10);      //建立链表display(list);        //输出显示建立的链表,这里是讯链表,不用输出sort(list);           //排序,称为有序列表display(list);        //显示排序后的链表 insert(list,-2);      //在有序列表中插入display(list);        //显示有序列表插入后的链表insert1(list,99);     //在有序列表中插入display(list);        //显示有序列表插入后的链表return 0;}


0 0