单向链表的有关操作(链式存储结构)
⑴随机产生或键盘输入一组元素,建立一个带头结点的单向链表(无序)。
⑵遍历单向链表。
⑶把单向链表中元素逆置(不允许申请新的结点空间)。
⑷在单向链表中删除所有的偶数元素结点。
⑸编写在非递减有序链表中插入一个元素使链表元素仍有序的函数,并利用该函数建立一个非递减有序单向链表。
⑹利用算法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
单向链表的有关操作(链式存储结构)相关推荐
- 线性表的链式存储结构以及单链表的插入和删除原理实现
线性表的链式存储结构 线性表中的每个元素最多只有一个前驱元素和一个后继元素(其逻辑结构),因此可以采用链式存储结构存储. 链表 线性表的链式存储结构称为链表.在链表中每个结点不仅包含有元素本身的信息( ...
- 数据结构之线性表——(二、链式存储结构)[c语言]
数据结构之线性表--(二.链式存储结构-单链表) 链式存储结构以及基本运算的实现 背景:由于线性表的存储特点是用物理上的相邻实现逻辑上的相邻,他要求用连续的存储单元顺序存储线性表中的各个元素,所以,对 ...
- 什么是数据的存储结构中的链式存储结构?
链式存储结构是数据的一种存储方式,它使用链表来存储数据.链表是一种由节点构成的数据结构,每个节点包含数据和指向下一个节点的指针.相邻节点之间使用指针连接,形成一条链表.与顺序存储结构不同,链式存储结构 ...
- 链表list(链式存储结构实现)_5 线性表的链式存储结构
系列文章参考资料为<大话数据结构>,源码为个人私有,未经允许不得转载 线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素,可以使连续的,也可以不连续,也就意味这些元素可以 ...
- 链表list(链式存储结构实现)_VOL.2 如何在python中实现链式存储结构
一.前言 链式存储作为一种重要的数据存储方式有着极强的数据组织能力.灵活型和动态性,在众多数据结构中应用非常广泛.所谓链式存储结构,就是采用分散的存储空间分别存储每一组数据再通过地址链接的形式将全部数 ...
- 二叉树的链式存储结构--二叉链表
1 二叉树的链式存储结构 //二叉链表的结点结构定义typedef int TElemType; typedef struct BiTNode {TElemType data;struct BiTNo ...
- STL链式存储结构——————list链表
c++的STL(标准模版库)提供了链表类的操作,称为list(表),是双向链表实现的 链式存储结构在实现插入.删除操作时不需要移动大量的数据元素.所以,链式存储结构适用于经常需要进行插入和删除操作的线 ...
- 数据结构(二):线性表包括顺序存储结构(顺序表、顺序队列和顺序栈)和链式存储结构(链表、链队列和链栈)...
还记得数据结构这个经典的分类图吧: 今天主要关注一下线性表. 什么是线性表 线性表的划分是从数据的逻辑结构上进行的.线性指的是在数据的逻辑结构上是线性的.即在数据元素的非空有限集中 (1) 存在唯一的 ...
- 《数据结构》c语言版学习笔记——其他链表(线性表的链式存储结构Part2)
线性表的链式存储结构 数据结构系列文章 第三章 循环链表.双向链表 文章目录 线性表的链式存储结构 前言 一.循环链表 (一)定义 (二)尾指针 二.双向链表 (一)定义 (二)代码 总结 前言 提示 ...
最新文章
- 好程序员大数据技术分享:Zookeeper集群管理与选举
- 【踩坑之旅】-webpack (v4.8.1) + vue-cli (v2.5.3)升级准备
- linux卸载minicoda2,MiniConda2下载 MiniConda python 2.7 v4.3.30.2 Linux 64位 官方免费版(附安装步骤) 下载-脚本之家...
- 南京铁道学院计算机应用,南京铁道职业技术学院交通运营管理专业怎么样
- mysql复制主从集群搭建
- 记录 Annotation processing is not supported for module cycles.
- SQL Server中行列转换 Pivot UnPivot
- 牛客网暑期ACM多校训练营(第九场)H. Prefix Sum(CDQ分治)
- 编译原理实验c语言cfg文法,编译原理实验指导终稿.pdf
- 与阿里合伙人合影,两年净赚一百万,这个草根姑娘有什么魔力?
- hosts文件是什么? Windows、Mac、Linux的hosts文件在哪里?
- 经营计划与经营利润分析动态报表的实现--业务需求
- jsp主机与asp主机的区别和支持分析
- 游戏开发程序员可能会遇到的英文单词
- 选择WMS仓储管理系统的10条“潜规则”
- 磨砂服务器波特率修改,MOXA串口服务器产品配置说明 附图.doc
- wechat微信聊天记录两台电脑转移
- 数据分析之数据透视表多维度计算(Office2019)
- 【网络】DPDK的基本原理|DPDK和RDMA的区别
- neo4j安装详细步骤(小白版)
热门文章
- Docker+Mongodb
- Oracle Database 9i 10g 11g编程艺术 深入数据库体系结构 第2版pdf
- 面向对象的软件测试技术
- [转]linux grep命令
- [zz]三权鼎立形式的软件开发方式
- javascript常用代码大全
- 《LeetCode力扣练习》第136题 只出现一次的数字 Java
- 基于 TensorFlow 的图像识别(R实现)
- 轻松搞定c++语言pdf_当年锤子的大爆炸,如今12个语言版本都可轻松搞定!
- mysql出现1499错误_连接MySQL时出现1449与1045异常解决办法