⑴随机产生或键盘输入一组元素,建立一个带头结点的单向链表(无序)。

⑵遍历单向链表。

⑶把单向链表中元素逆置(不允许申请新的结点空间)。

⑷在单向链表中删除所有的偶数元素结点。

⑸编写在非递减有序链表中插入一个元素使链表元素仍有序的函数,并利用该函数建立一个非递减有序单向链表。

⑹利用算法5建立两个非递减有序单向链表,然后合并成一个非递增链表。

⑺利用算法5建立两个非递减有序单向链表,然后合并成一个非递减链表。

⑻利用算法1建立的链表,实现将其分解成两个链表,其中一个全部为奇数,另一个全部为偶数(尽量利用已知的存储空间)

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

  1 #include <cstdlib>
  2 #include <iostream>
  3 #include <stdlib.h>
  4 #include <stdio.h>
  5 using namespace std;
  6
  7 typedef struct Lnode{
  8         int data;
  9         struct Lnode * next;
 10         }Lnode,*Linklist;
 11
 12
 13
 14 Lnode * input()//输入;
 15 {
 16      cout<<"请输入整型数据,以^Z结束输入\n";
 17
 18      Linklist p1,p2,headlist;
 19      int str;
 20      headlist=(Lnode *)malloc(sizeof(Lnode));
 21      p1=p2=headlist;
 22      if(p1==NULL)
 23      {cout<<"存储空间申请失败,结束输入:\n";return NULL;}
 24
 25      headlist->next=NULL;
 26      while(scanf("%d",&str)!=EOF)
 27      {
 28
 29
 30
 31
 32
 33              p1=(Lnode *)malloc(sizeof(Lnode));
 34
 35              p1->data=str;
 36              p2->next=p1;
 37              p2=p1;
 38              p2->next=NULL;
 39       }
 40
 41              return headlist;
 42 }
 43
 44 bool output(Linklist headlist)//输出;
 45 {
 46               Linklist p1;
 47               p1=headlist->next;
 48               if(!p1)
 49               return 0;
 50               while(p1!=NULL)
 51               {
 52                             cout<<p1->data<<' ';
 53                              p1=p1->next;
 54               }
 55               cout<<endl;
 56               return 1;
 57 }
 58
 59 int length(Linklist headlist)//求链表长度;
 60 {
 61     Linklist p;
 62     int count=1;
 63     p=headlist->next;
 64
 65     while(p->next!=NULL)
 66     {
 67                         count++;
 68                         p=p->next;
 69     }
 70     return count;
 71 }
 72
 73 bool fz(Linklist headlist,int n)//对链表元素进行反转;
 74 {
 75      int i,j,k,t;
 76      Linklist p1,p2;
 77      k=n/2;
 78      p1=p2=headlist;
 79      if(headlist->next==NULL)
 80      return false;
 81      for(i=1;i<=k;i++)
 82      {p2=p2->next;
 83
 84
 85                       p1=p2;
 86                       for(j=i+1;j<=n-i+1;j++)
 87                        {p1=p1->next;}
 88                        t=p2->data;p2->data=p1->data;p1->data=t;
 89      }
 90      return true;
 91 }
 92
 93
 94
 95 int delete_even(Linklist headlist)//删除偶数;
 96 {
 97
 98     Linklist p1,p2;
 99     if(headlist->next==NULL)
100     {cout<<"链表是空表\n";return 0;}
101     p1=headlist->next;
102     p2=headlist;
103     while(p1)
104     {
105              if(p1->data%2==0)
106              {p2->next=p1->next;
107               free(p1);
108               p1=p2->next;
109               }
110               else
111               {
112                   p1=p1->next;
113                   p2=p2->next;
114               }
115     }
116
117
118     return 1;
119 }
120
121
122 Linklist divide(Linklist headlist)//将链表分割为两个;返回偶数链表的头地址;
123 {
124          Linklist p1,p2,p3;
125          int t;
126          if(headlist->next==NULL)
127          {cout<<"链表为空表\n";return NULL;}
128          int i,j,k;
129          for(p1=headlist->next;p1->next!=NULL;p1=p1->next)
130          {
131                 p3=p1;
132                 if(p3->data%2==1)
133                 continue;
134                 for(p2=p1->next;p2!=NULL;p2=p2->next)
135                 {
136                                                      if(p2->data%2==1)
137                                                      p3=p2;
138                 }
139                 if(p1!=p3)
140                 {
141                           t=p1->data;p1->data=p3->data;p3->data=t;
142                 }
143          }
144
145          for(p1=headlist->next,p2=headlist;p1!=NULL;p1=p1->next,p2=p2->next)
146          {
147                                                     if(p1->data%2==0)
148                                                     break;
149          }
150
151          if((p1!=NULL)&&(p1!=headlist->next))
152          {p3=(Linklist)malloc(sizeof(Lnode));
153          p3->next=p1;
154          p2->next=NULL;
155          return p3;
156          }
157          else if(p1==headlist->next)
158          {cout<<"链表元素全为偶数\n";return headlist;}
159          else
160          {cout<<"链表元素全为奇数\n";return NULL;}
161
162
163
164 }
165
166 int delete_list(Linklist headlist)//将链表清空;
167 {   if(headlist==NULL)
168      return 0;
169     Linklist p1,p2;
170     p1=headlist;p2=p1->next;
171     while(p2)
172     {
173
174             free(p1);
175             p1=p2;
176             p2=p2->next;
177     }
178     free(p1);
179     return 1;
180 }
181
182
183 int insert(Linklist headlist,int e)//非递减插入元素;
184 {Linklist p2,p1,p3;
185 p2=headlist;
186 p1=p2->next;
187 while(p1)
188 {if(p1->data>e)
189  break;
190  p2=p2->next;
191  p1=p1->next;
192 }
193
194
195  p3=(Linklist)malloc(sizeof(Lnode));
196  if(p3==NULL)
197  {cout<<"空间申请失败\n";return 0;}
198  p3->data=e;
199  p3->next=p1;
200  p2->next=p3;
201  return 1;
202 }
203
204
205 int length_list(Linklist headlist)//求链表长度;
206 {
207     Linklist p;
208     int count=1;
209     p=headlist->next;
210
211     while(p->next!=NULL)
212     {
213                         count++;
214                         p=p->next;
215     }
216     return count;
217 }
218
219 bool sort(Linklist headlist,int n)//排序;
220 {
221      int i,j,k;
222      int t,s;
223      Linklist p1,p2;
224      p1=p2=headlist->next;
225      k=n-1;
226      for(i=k;i>=1;i--)
227      {p1=p2=headlist->next;
228        p1=p2->next;
229                       for(j=1;j<=i;j++)
230                       {
231                             if(p2->data<p1->data)
232                              {t=p2->data;p2->data=p1->data;p1->data=t;}
233                              p1=p1->next;
234                              p2=p2->next;
235                       }
236      }
237      return true;
238 }
239
240
241
242 Linklist union1_list(Linklist head1,Linklist head2)//将两个链表合并为一个,合并后仍为非递减;
243 {
244     Linklist p;
245     p=head2->next;
246     while(p)
247     {
248             insert(head1,p->data);
249             p=p->next;
250     }
251     delete_list(head2);
252     return head1;
253 }
254
255
256
257 int main(int argc, char *argv[])
258 {Linklist headlist;
259    headlist=input();
260     cout<<"输出输入的元素\n";
261
262     output(headlist);
263
264   fz(headlist,length(headlist));
265   cout<<"逆置后的元素为\n";
266
267     output(headlist);
268     delete_even(headlist);
269     cout<<"删除偶数后的链表序列为:\n";
270     output(headlist);
271     cout<<"将链表分割为奇数和偶数的两部分\n";
272     Linklist p=divide(headlist);
273     if(p==NULL)
274     {cout<<"偶数链表为空表\n";
275      cout<<"奇数链表为:\n";
276      output(headlist);
277      delete_list(headlist);
278     }
279     else if(p==headlist)
280     {cout<<"奇数链表为空表\n";
281     cout<<"偶数链表为\n";
282     output(headlist);
283     delete_list(headlist);
284      }
285      else
286      {  cout<<"偶数链表的元素为\n";
287         output(p);
288         delete_list(p);
289         cout<<"奇数链表的元素为\n";
290         output(headlist);
291         delete_list(headlist);
292      }
293
294      cout<<"非递减整数序列:\n";
295      headlist=input();
296      cout<<"输入的元素为\n";
297      output(headlist);
298      cout<<"请输入要插入的元素\n";
299      int e;
300      cin>>e;
301      insert(headlist,e);
302      cout<<"插入后的链表为\n";
303      output(headlist);
304      delete_list(headlist);
305      Linklist head1,head2,head3;
306      cout<<"非递减整数序列1:\n";
307      head1=input();
308      cout<<"输入的表1为\n";
309      output(head1);
310      cout<<"非递减整数序列2:\n";
311      head2=input();
312      cout<<"输入的表2为\n";
313      output(head2);
314
315
316
317      head3=union1_list(head1,head2);
318      cout<<"合并后的非递减链表为\n";
319      output(head3);
320      sort(head3,length_list(head3));
321      cout<<"合并后的非递增链表为\n";
322
323      output(head3);
324      delete_list(head3);
325
326
327
328
329     system("PAUSE");
330     return EXIT_SUCCESS;
331 }

转载于:https://www.cnblogs.com/zjushuiping/archive/2012/05/30/2526976.html

单向链表的有关操作(链式存储结构)相关推荐

  1. 线性表的链式存储结构以及单链表的插入和删除原理实现

    线性表的链式存储结构 线性表中的每个元素最多只有一个前驱元素和一个后继元素(其逻辑结构),因此可以采用链式存储结构存储. 链表 线性表的链式存储结构称为链表.在链表中每个结点不仅包含有元素本身的信息( ...

  2. 数据结构之线性表——(二、链式存储结构)[c语言]

    数据结构之线性表--(二.链式存储结构-单链表) 链式存储结构以及基本运算的实现 背景:由于线性表的存储特点是用物理上的相邻实现逻辑上的相邻,他要求用连续的存储单元顺序存储线性表中的各个元素,所以,对 ...

  3. 什么是数据的存储结构中的链式存储结构?

    链式存储结构是数据的一种存储方式,它使用链表来存储数据.链表是一种由节点构成的数据结构,每个节点包含数据和指向下一个节点的指针.相邻节点之间使用指针连接,形成一条链表.与顺序存储结构不同,链式存储结构 ...

  4. 链表list(链式存储结构实现)_5 线性表的链式存储结构

    系列文章参考资料为<大话数据结构>,源码为个人私有,未经允许不得转载 线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素,可以使连续的,也可以不连续,也就意味这些元素可以 ...

  5. 链表list(链式存储结构实现)_VOL.2 如何在python中实现链式存储结构

    一.前言 链式存储作为一种重要的数据存储方式有着极强的数据组织能力.灵活型和动态性,在众多数据结构中应用非常广泛.所谓链式存储结构,就是采用分散的存储空间分别存储每一组数据再通过地址链接的形式将全部数 ...

  6. 二叉树的链式存储结构--二叉链表

    1 二叉树的链式存储结构 //二叉链表的结点结构定义typedef int TElemType; typedef struct BiTNode {TElemType data;struct BiTNo ...

  7. STL链式存储结构——————list链表

    c++的STL(标准模版库)提供了链表类的操作,称为list(表),是双向链表实现的 链式存储结构在实现插入.删除操作时不需要移动大量的数据元素.所以,链式存储结构适用于经常需要进行插入和删除操作的线 ...

  8. 数据结构(二):线性表包括顺序存储结构(顺序表、顺序队列和顺序栈)和链式存储结构(链表、链队列和链栈)...

    还记得数据结构这个经典的分类图吧: 今天主要关注一下线性表. 什么是线性表 线性表的划分是从数据的逻辑结构上进行的.线性指的是在数据的逻辑结构上是线性的.即在数据元素的非空有限集中 (1) 存在唯一的 ...

  9. 《数据结构》c语言版学习笔记——其他链表(线性表的链式存储结构Part2)

    线性表的链式存储结构 数据结构系列文章 第三章 循环链表.双向链表 文章目录 线性表的链式存储结构 前言 一.循环链表 (一)定义 (二)尾指针 二.双向链表 (一)定义 (二)代码 总结 前言 提示 ...

最新文章

  1. 好程序员大数据技术分享:Zookeeper集群管理与选举
  2. 【踩坑之旅】-webpack (v4.8.1) + vue-cli (v2.5.3)升级准备
  3. linux卸载minicoda2,MiniConda2下载 MiniConda python 2.7 v4.3.30.2 Linux 64位 官方免费版(附安装步骤) 下载-脚本之家...
  4. 南京铁道学院计算机应用,南京铁道职业技术学院交通运营管理专业怎么样
  5. mysql复制主从集群搭建
  6. 记录 Annotation processing is not supported for module cycles.
  7. SQL Server中行列转换 Pivot UnPivot
  8. 牛客网暑期ACM多校训练营(第九场)H. Prefix Sum(CDQ分治)
  9. 编译原理实验c语言cfg文法,编译原理实验指导终稿.pdf
  10. 与阿里合伙人合影,两年净赚一百万,这个草根姑娘有什么魔力?
  11. hosts文件是什么? Windows、Mac、Linux的hosts文件在哪里?
  12. 经营计划与经营利润分析动态报表的实现--业务需求
  13. jsp主机与asp主机的区别和支持分析
  14. 游戏开发程序员可能会遇到的英文单词
  15. 选择WMS仓储管理系统的10条“潜规则”
  16. 磨砂服务器波特率修改,MOXA串口服务器产品配置说明 附图.doc
  17. wechat微信聊天记录两台电脑转移
  18. 数据分析之数据透视表多维度计算(Office2019)
  19. 【网络】DPDK的基本原理|DPDK和RDMA的区别
  20. neo4j安装详细步骤(小白版)

热门文章

  1. Docker+Mongodb
  2. Oracle Database 9i 10g 11g编程艺术 深入数据库体系结构 第2版pdf
  3. 面向对象的软件测试技术
  4. [转]linux grep命令
  5. [zz]三权鼎立形式的软件开发方式
  6. javascript常用代码大全
  7. 《LeetCode力扣练习》第136题 只出现一次的数字 Java
  8. 基于 TensorFlow 的图像识别(R实现)
  9. 轻松搞定c++语言pdf_当年锤子的大爆炸,如今12个语言版本都可轻松搞定!
  10. mysql出现1499错误_连接MySQL时出现1449与1045异常解决办法