双向链表的有关操作(链式存储结构)

⑴利用尾插法建立一个双向链表。

⑵遍历双向链表。

⑶实现双向链表中删除一个指定元素。

⑷在非递减有序双向链表中实现插入元素e仍有序算法。

⑸判断双向链表中元素是否对称若对称返回1否则返回0。

⑹设元素为正整型,实现算法把所有奇数排列在偶数之前。

⑺在主函数中设计一个简单的菜单调试上述算法。

(4)实验四  栈和队列的有关操作

⑴采用链式存储实现栈的初始化、入栈、出栈操作。

⑵采用顺序存储实现栈的初始化、入栈、出栈操作。

⑶采用链式存储实现队列的初始化、入队、出队操作。

⑷采用顺序存储实现循环队列的初始化、入队、出队操作。

⑸在主函数中设计一个简单的菜单,分别测试上述算法。

 

 

  1 #include <cstdlib>
  2 #include <iostream>
  3 
  4 using namespace std;
  5 typedef struct Dulnode{
  6         int data;
  7         struct Dulnode *prior;
  8         struct Dulnode *next;
  9         }Dulnode,*Dullinklist;
 10        
 11 bool init(Dullinklist &headlist)//初始化;
 12 {
 13      Dullinklist p;
 14      p=(Dulnode *)malloc(sizeof(Dullinklist));
 15      if(p==NULL)
 16      {cout<<"初始化失败\n";return false;}
 17                 p->next=p;
 18                 p->prior=p;
 19                 headlist=p;
 20                 return true;
 21 }
 22                
 23 bool input(Dullinklist headlist)//输入;
 24 { cout<<"请输入元素,以^Z结束输入\n";
 25  Dullinklist p1,p2;
 26  int i,j,k;
 27  int a;
 28  while(scanf("%d",&a)!=EOF)
 29  {
 30                            p1=(Dulnode *)malloc(sizeof(Dulnode));
 31                            if(p1==NULL)
 32                            {cout<<"内存申请失败,结束输入\n";return false;}
 33                            p1->data=a;
 34                            headlist->prior->next=p1;
 35                            p1->next=headlist;
 36                            p1->prior=headlist->prior;
 37                            headlist->prior=p1;
 38  }
 39  cout<<"输入完成\n";
 40  return true;
 41 }
 42 
 43 bool output(Dullinklist headlist)//元素的输出;
 44 {if(headlist->next==headlist->prior)
 45 {cout<<"该表为空表\n";return false;}
 46  
 47      cout<<"该表元素为:\n";
 48      Dullinklist p1,p2;
 49      p1=headlist->next;
 50     
 51      while(p1!=headlist)
 52      {
 53                         cout<<p1->data<<' ';
 54                         p1=p1->next;
 55      }
 56      return true;
 57  }
 58  
 59  
 60  bool delete_node(Dullinklist headlist,int e)//删除第e个元素;
 61  {
 62       Dullinklist p1,p2;
 63       if(headlist->next==headlist->prior)
 64       {cout<<"该表为空表\n";return false;}
 65      
 66      
 67       int i;
 68       p1=headlist->next;
 69       for(i=1;i<=e;i++)
 70       {
 71                 if(p1==headlist)
 72                 {cout<<""<<e<<"个元素不存在\n";return false;}
 73                 p1=p1->next;
 74       }
 75       p1=p1->prior;
 76       p1->prior=p1->next;
 77       p1->next->prior=p1->prior;
 78       cout<<"删除的第"<<e<<"个元素为:"<<p1->data<<endl;
 79       free(p1);
 80       return true;
 81  }
 82  
 83 bool free_Dullink(Dullinklist headlist)//删除链表;
 84 {Dullinklist p1,p2;
 85 p1=headlist;
 86 p2=headlist;
 87 p1=p1->next;
 88 while(p1!=p2)
 89 {
 90                    free(p1);
 91                    p1=p1->next;
 92 }
 93 //free(p2);
 94 p2->next=headlist;
 95 p2->prior=headlist;
 96 return true;
 97 }
 98  
 99  bool insert(Dullinklist headlist,int e)//元素的插入;
100  {
101       Dullinklist p1,p2,p3;
102       p3=(Dulnode *)malloc(sizeof(Dulnode));
103       if(p3==NULL)
104       {cout<<"内存申请失败\n";return false;}
105       p3->data=e;
106      
107      
108       p1=headlist->next;
109       while(p1!=headlist)
110       {
111                          if(p1->data>e)
112                          break;
113                          p1=p1->next;
114                         
115      
116       }
117      
118       p2=p1->prior;
119       p2->next=p3;
120       p3->prior=p2;
121       p3->next=p1;
122       p1->prior=p3;
123       return true;
124  }
125  
126  
127  bool judge(Dullinklist headlist)//判断;
128  {
129       Dullinklist p1,p2;
130       if(headlist->next==headlist->prior)
131       {cout<<"链表是空表\n";return false;}
132       p1=headlist->next;
133       p2=headlist->prior;
134       while(p1!=p2)
135       {
136                    if(p1->data!=p2->data)
137                    return false;
138                    p1=p1->next;
139                    p2=p2->prior;
140       }
141       return true;
142  }
143  
144  
145  
146  int fz(Dullinklist headlist)//奇数排在偶数前面;
147  {if(headlist->next==headlist->prior)
148  {cout<<"链表是空表\n";return false;}
149      Dullinklist p1,p2,p3;
150      int t;
151      for(p1=headlist->next;p1!=headlist->prior;p1=p1->next)
152      {p3=p1;
153       for(p2=p1->next;p2!=headlist;p2=p2->next)
154       {if(p3->data%2==0)
155         p3=p2;
156         }
157         if(p3!=p1)
158         {t=p3->data;p3->data=p1->data;p1->data=t;}
159       }
160         return true;
161  }
162      
163      
164      
165  
166      
167       
168                
169                
170       
171      
172      
173                           
174                            
175        
176 int main(int argc, char *argv[])
177 {
178      int e;
179     Dullinklist headlist;
180     init(headlist);
181     input(headlist);
182     output(headlist);
183     cout<<"请输入要删除链表中的第几个元素\n";
184     scanf("%d",&e);
185     delete_node(headlist,e);
186     free_Dullink(headlist);
187     cout<<"非降序列的输入\n";
188    
189   input(headlist);
190   cout<<"请输入要插入的元素\n";
191   scanf("%d",&e);
192   cout<<"插入元素后的序列为:\n";
193  
194   insert(headlist,e);
195   output(headlist);
196   if(!judge(headlist))
197   cout<<"不对称\n";
198   else
199   cout<<"对称\n";
200   fz(headlist);
201   cout<<"奇数排在偶数前面\n";
202   output(headlist);
203   
204  
205    
206     
207    
208    
209    
210    
211    
212    
213     system("PAUSE");
214     return EXIT_SUCCESS;
215 }
posted @ 2012-05-30 21:43  cseriscser  阅读(794)  评论(0编辑  收藏  举报