双向链表的操作

2013-08-17 17:57:12

双向链表的操作。

代码(测试通过,暂未发现错误,欢迎交流指正!):

  1 #include <iostream>
  2 #include <cassert>
  3 using namespace std;
  4 
  5 typedef int DataType;  //链表元素类型
  6 
  7 typedef struct doubleLinkNode    //双向链表结点
  8 {
  9     DataType data;
 10     doubleLinkNode *prior;
 11     doubleLinkNode *next;
 12 }DLNode,*PDLNode;
 13 
 14 //链表初始化
 15 void InitDoubleLink(PDLNode &pHead)
 16 {
 17     pHead = new DLNode;
 18     pHead->data = 0;
 19     pHead->prior = NULL;
 20     pHead->next = NULL;
 21 }
 22 
 23 //创建链表
 24 PDLNode CreatDoubleLink(PDLNode &pHead)
 25 {
 26     DataType dataTmp = 0;
 27     PDLNode pNew = NULL;
 28     //PDLNode pPre = pHead;
 29 
 30     InitDoubleLink(pHead);
 31     PDLNode pPre = pHead;  //在InitDoubleLink之后赋值,而不是在之前赋值
 32 
 33     cout<<"Please enter the elements of the link  ,separate with space,and end with ctrl+z :"<<endl;
 34     while (cin>>dataTmp)
 35     {
 36         pNew = new DLNode;  //new出来的空间需要测试是否为空吗?
 37         pNew->data = dataTmp;
 38         pNew->next = NULL;
 39         pNew->prior = pPre;
 40 
 41         pPre->next = pNew;
 42         pPre = pNew;
 43     }
 44 
 45     return pHead;
 46 }
 47 
 48 //删除链表元素
 49 PDLNode DeleteDoubleLink(PDLNode &pHead,size_t posToDelete)
 50 {
 51     assert(NULL != pHead);
 52 
 53     PDLNode pCur = pHead;
 54     while (posToDelete--)  
 55     {
 56         pCur = pCur->next;
 57         assert(NULL != pCur);
 58     }
 59 
 60     pCur->prior->next = pCur->next;
 61     if (pCur->next != NULL)
 62     {
 63         pCur->next->prior = pCur->prior;
 64     }
 65 
 66     delete pCur;
 67     return pHead;
 68 }
 69 
 70 //链表插入
 71 PDLNode InsertDoubleLink(PDLNode &pHead,size_t posToInsert,const DataType dataToInsert)
 72 {
 73     assert(NULL != pHead);
 74 
 75     PDLNode pNew = new DLNode;  //new出来的空间需要测试是否为空吗?
 76     pNew->data = dataToInsert;
 77     pNew->next = NULL;
 78     pNew->prior = NULL;
 79 
 80     PDLNode pCur = pHead;
 81     while (posToInsert--)  
 82     {
 83         pCur = pCur->next;
 84         assert(NULL != pCur);
 85     }
 86 
 87     pNew->prior = pCur;
 88     pNew->next = pCur->next;
 89     pCur->next = pNew;
 90 
 91     if (pCur->next != NULL)   //对插入到尾部的情况进行处理
 92     {
 93         pCur->next->prior = pNew;
 94     }
 95 
 96     return pHead;
 97 }
 98 
 99 //链表显示
100 void DisplayDoubleLink(const PDLNode &pHead)
101 {
102     assert(NULL != pHead);
103     PDLNode pCur = pHead->next;
104 
105     while (NULL != pCur)
106     {
107         cout<<pCur->data<<"	";
108         pCur = pCur->next;
109     }
110     cout<<endl;
111 }
112 
113 //链表销毁
114 void DestoryDoubleLink(PDLNode &pHead)
115 {
116     assert(NULL != pHead);
117     PDLNode pCur = pHead->next;
118     
119     while (NULL != pCur)
120     {
121         delete pCur->prior;
122         pCur = pCur->next;
123     }
124 }
125 
126 //链表测试
127 void TestDoubleLink()
128 {
129     PDLNode pHead = NULL;
130 
131     //Test CreatDoubleLink...
132     cout<<"Test CreatDoubleLink..."<<endl;
133     pHead = CreatDoubleLink(pHead);
134     cout<<"display the link created by CreatLink : "<<endl;
135     DisplayDoubleLink(pHead);
136     cin.clear();  //清除流状态
137     cin.sync();
138     
139 
140     //Test InsertDoubleLink...
141     //cout<<"Test InsertDoubleLink..."<<endl;
142     //size_t posToInsert = 0;
143     //DataType dataToInsert = 0;
144 
145     //cout<<"Please enter the position and the data to insert,end with ctrl+z :"<<endl;
146     //while (cin>>posToInsert>>dataToInsert)
147     //{
148     //    cout<<"The link before insertion : "<<endl;
149     //    DisplayDoubleLink(pHead);
150 
151     //    pHead = InsertDoubleLink(pHead,posToInsert,dataToInsert);
152 
153     //    cout<<"The link after insertion : "<<endl;
154     //    DisplayDoubleLink(pHead);
155 
156     //    cout<<"Please enter the position to insert,end with ctrl+z :"<<endl;
157     //}
158     //cin.clear();  //清除流状态
159     //cin.sync();
160 
161     //Test DeleteDoubleLink...
162     size_t posToDelete = 0;
163     
164     cout<<"Please enter the position to delete,end with ctrl+z :"<<endl;
165     while (cin>>posToDelete)
166     {
167         cout<<"The link before insertion : "<<endl;
168         DisplayDoubleLink(pHead);
169 
170         pHead = DeleteDoubleLink(pHead,posToDelete);
171 
172         cout<<"The link after delete : "<<endl;
173         DisplayDoubleLink(pHead);
174 
175         cout<<"Please enter the position to delete,end with ctrl+z :"<<endl;
176     }
177 
178     cin.clear();  //清除流状态
179     cin.sync();
180 
181     DestoryDoubleLink(pHead);
182 }
183 
184 //main
185 int main()
186 {
187     TestDoubleLink();
188     return 0;
189 }
原文地址:https://www.cnblogs.com/youngforever/p/3264916.html