博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基于双向链表的增删改查和排序(C++实现)
阅读量:4559 次
发布时间:2019-06-08

本文共 3690 字,大约阅读时间需要 12 分钟。

双向链表也叫,是链表的一种,它的每个数据结点中都有两个,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向。

由于双向链表可以方便地实现正序和逆序两个方向的插入、查找等功能,在很多算法中经常被使用,

这里用C++构造了一个双向链表,提供了对双向链表的插入、查找、删除节点、排序等功能,其中排序提供了插入排序和冒泡排序两种方式

1 #include
2 3 using namespace std; 4 5 class Node //组成双向链表的节点 6 { 7 public: 8 int data; 9 Node * pNext; 10 Node * pLast; 11 }; 12 13 class List //构造一个双向链表 14 { 15 private: 16 Node * pHead; 17 Node * pTail; 18 int length; 19 public: 20 List(int length)    //创建双向链表 21 { 22 this->length=length; 23 pHead=new Node(); 24 pHead->pLast=NULL; 25 pTail=pHead; 26 for(int i=0;i
>temp->data; 31 temp->pNext=NULL; 32 temp->pLast=pTail; 33 pTail->pNext=temp; 34 pTail=temp; 35 } 36 } 37 38 void traverseList()    //正向遍历 39 { 40 Node * p=pHead->pNext; 41 while(p!=NULL) 42 { 43 cout<
data<
pNext; 45 } 46 } 47 48 void traverseListReturn()    //逆向遍历 49 { 50 Node * p=pTail; 51 while(p->pLast!=NULL) 52 { 53 cout<
data<
pLast; 55 } 56 } 57 58 void sortList() //冒泡排序 59 { 60 Node * p=new Node(); 61 Node * q=new Node(); 62 int temp; 63 for(p=pHead->pNext;p->pNext!=NULL;p=p->pNext) 64 { 65 for(q=p->pNext;q!=NULL;q=q->pNext) 66 { 67 if(q->data
data) 68 { 69 temp=q->data; 70 q->data=p->data; 71 p->data=temp; 72 } 73 } 74 } 75 } 76 77 void sortListByInsertWay() //插入排序 78 { 79 if(pHead->pNext==NULL||pHead->pNext->pNext==NULL) 80 { 81 return; 82 } 83 Node * p2=pHead->pNext->pNext; 84 Node * p1=pHead; 85 pHead->pNext->pNext=NULL; 86 while(p2) 87 { 88 Node * pN=p2->pNext; 89 while(p1->pNext) 90 { 91 if(p2->data
pNext->data) 92 { 93 p2->pNext=p1->pNext; 94 p2->pLast=p1; 95 p1->pNext->pLast=p2; 96 p1->pNext=p2; 97 break; 98 } 99 p1=p1->pNext;100 }101 if(p1->pNext==NULL)102 {103 p2->pNext=NULL;104 p2->pLast=p1;105 p1->pNext=p2;106 }107 p2=pN;108 }109 110 //重新查找pTail的位置111 Node * pt=pHead;112 while(pt->pNext)113 {114 pt=pt->pNext;115 }116 pTail=pt;117 }118 119 void changeList(int num,int position)    //修改链表中指定位置的节点120 {121 Node * p=pHead->pNext;122 if(position>length||position<=0)123 {124 cout<<"over stack !"<
pNext;130 }131 p->data=num;132 }133 134 void insertList(int num,int position)    //插入数据135 {136 Node * p=pHead->pNext;137 if(position>length||position<=0)138 {139 cout<<"over stack !"<
pNext;145 }146 Node * temp=new Node();147 temp->data=num;148 temp->pNext=p;149 temp->pLast=p->pLast;150 p->pLast->pNext=temp;151 p->pLast=temp;152 length++;153 }154 155 void clearList()      //清空156 {157 Node * q;158 Node * p=pHead->pNext;159 while(p!=NULL)160 {161 q=p;162 p=p->pNext;163 delete q;164 }165 p=NULL;166 q=NULL;167 }168 169 void deleteList(int position)   //删除指定位置的节点170 {171 Node * p=pHead->pNext;172 if(position>length||position<=0)173 {174 cout<<"over stack !"<
pNext;180 }181 p->pLast->pNext=p->pNext;182 p->pNext->pLast=p->pLast;183 delete p;184 length--;185 }186 187 int getItemInList(int position)      //查找指定位置的节点188 {189 Node * p=pHead->pNext;190 if(position>length||position<=0)191 {192 cout<<"over stack !"<
pNext;198 }199 return p->data;200 }201 202 ~List()203 {204 Node * q;205 Node * p=pHead->pNext;206 while(p!=NULL)207 {208 q=p;209 p=p->pNext;210 delete q;211 }212 p=NULL;213 q=NULL;214 }215 216 };217 218 int main()219 {220 List l(3);221 l.traverseList();222 cout<<"AFTER SORT------------------------------------------------------"<

 

转载于:https://www.cnblogs.com/flypie/p/5015711.html

你可能感兴趣的文章
深入理解计算机系统(1.4)---并发与并行、浅谈抽象
查看>>
函数依赖的公理化系统
查看>>
rabbitmq学习(四):利用rabbitmq实现远程rpc调用
查看>>
侯捷C++学习(二)
查看>>
EasyPlayer RTSP Android安卓播放器修复播放画面卡在第一帧bug
查看>>
web项目中全局常量的添加
查看>>
搬运工程 启动!
查看>>
局部加权回归(LWR) Matlab模板
查看>>
Connect to the DSP on C6A8168/DM8168/DM8148 using CCS
查看>>
hibernate在使用getCurrentSession时提示no session found for current thread
查看>>
【Luogu1471】方差(线段树)
查看>>
【agc028E】High Elements(动态规划,线段树,贪心)
查看>>
DEV中svg图标的使用
查看>>
Codefroces Gym101572 I.Import Spaghetti-有向图跑最小环输出路径(Floyd)
查看>>
有关位运算的操作+二进制状态压缩
查看>>
Eclipse插件 -- 阿里巴巴扫描编码规插件
查看>>
(1.1)学习笔记之mysql体系结构(内存、进程、线程)
查看>>
markdown测试
查看>>
Java-Maven-Runoob:Maven 依赖管理
查看>>
杂项-Log:log4net
查看>>