c++实现双向有序链表的,增,删,查,合并

  • Post author:
  • Post category:其他


#include<iostream>

using namespace std;

struct DouLinkList{

DouLinkList* pre;

int data;

DouLinkList* next;

};

DouLinkList* createLinkList(){//创建一个带头结点的双向链表,头结点数据域记录链表长度

DouLinkList* L=new DouLinkList();

L->data=0;

L->next=NULL;

L->pre=NULL;

return L;

}

void insertNode(DouLinkList* L,int elem){//插入时保持链表有序

DouLinkList* cur=L->next;

DouLinkList* pre1=L;

if(L->data==0){//只有头结点

DouLinkList* p=new DouLinkList();

p->data=elem;

L->next=p;

p->pre=L;

p->next=NULL;

L->data+=1;

}

else{

while(cur!=NULL&&cur->data<elem){//寻找插入结点

pre1=cur;

cur=cur->next;

}

if(!cur){//链表尾节点后插入

DouLinkList* p=new DouLinkList();

p->data=elem;

pre1->next=p;

p->pre=pre1;

p->next=NULL;

L->data+=1;

}

else{//l链表中间插入

DouLinkList* p=new DouLinkList();

p->data=elem;

pre1->next=p;

p->pre=pre1;

p->next=cur;

cur->pre=p;

L->data+=1;

}

}

}

DouLinkList* checkNode(DouLinkList* L,int elem){//返回指向元素的指针,如果链表中没有该元素则返回空指针

DouLinkList* cur=L->next;

while((elem!=cur->data)&&!cur) cur=cur->next;

return cur;

}

void deleteNode(DouLinkList* L,int elem){

DouLinkList* cur=checkNode(L,elem);

if(cur){//如果元素存在。删除结点,链表长度减1

if(!cur->next) {//钙元素为链表为元素

delete cur;

L->data-=1;

}

else{//不是链表尾元素

cur->pre->next=cur->next;

cur->next->pre=cur->pre->next;

delete cur;

L->data-=1;

}

}

}

void output(DouLinkList* L){

DouLinkList* cur=L->next;

if(L->data==0){

cout<<“链表长度为0″<<endl;

}

else{

cout<<“链表长度为:”<<L->data<<endl;

cout<<“链表元素为:”;

while(cur){

cout<<cur->data<<” “;

cur=cur->next;

}

cout<<endl;

}

}

DouLinkList* mergeTwoLinkList(DouLinkList* L1,DouLinkList* L2){//合并两个链表成为有序链表

DouLinkList* L3=new DouLinkList();

DouLinkList* L4=L3;

L3->data=L1->data+L2->data;

L1=L1->next;

L2=L2->next;

while(L1&&L2){

if(L1->data<L2->data){

L3->next=L1;

L1->pre=L3;

L1=L1->next;

L3=L3->next;

}

else{

L3->next=L2;

L2->pre=L3;

L2=L2->next;

L3=L3->next;

}

}

while(L1){

L3->next=L1;

L1->pre=L3;

L1=L1->next;

L3=L3->next;

}

while(L2){

L3->next=L2;

L2->pre=L3;

L2=L2->next;

L3=L3->next;

}

return L4;

}

int main(){

DouLinkList* L=createLinkList();

DouLinkList* L1=createLinkList();

insertNode(L,1);

insertNode(L,3);

insertNode(L,2);

insertNode(L1,4);

insertNode(L1,5);

output( mergeTwoLinkList(L,L1));

return 0;

}



版权声明:本文为qq_16773675原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。