线性表的有关操作
来源:互联网 发布:淘宝如何添加背景音乐 编辑:程序博客网 时间:2024/04/30 05:05
目的要求:
⑴掌握单向链表的存储特点及其实现。
⑵掌握单向链表的插入、删除算法及其应用算法的程序实现。
实验内容:
⑴随机产生或键盘输入一组元素,建立一个带头结点的单向链表(无序)。
⑵遍历单向链表。
⑶把单向链表中元素逆置(不允许申请新的结点空间)。
⑷在单向链表中删除所有的偶数元素结点。
⑸编写在非递减有序链表中插入一个元素使链表元素仍有序的函数,并利用该函数建立一个非递减有序单向链表。
⑹利用算法5建立两个非递减有序单向链表,然后合并成一个非递增链表。
⑺利用算法5建立两个非递减有序单向链表,然后合并成一个非递减链表。
#include <iostream>#include <stdio.h>#include <stdlib.h>#include<string.h>#include<algorithm>#include<math.h>#include<queue>using namespace std;typedef long long ll;struct data{ int n; data *next;};data shuru(int n,data root)///输入{ data *p=&root; while(n--) { int t; cin>>t; data *pp=(data*)malloc(sizeof(data)); pp->n=t; pp->next=NULL; p->next=pp; p=pp; } return root;}void bianli(data root)///遍历{ data *p=root.next; while(p!=NULL) { int hh=p->n; cout<<hh<<' '; p=p->next; } cout<<endl;}data nizhi(data root)///逆置{ data *p=NULL,*pp=root.next,*tem=pp->next; while(pp!=NULL) { pp->next=p; p=pp; pp=tem; if(tem!=NULL) tem=tem->next; } root.next=p; return root;}data shanoushu(data root)///删除偶数节点{ data *p=&root,*pp=p->next; while(pp!=NULL) { if((pp->n)%2==0) p->next=pp->next,free(pp); else p=p->next; pp=p->next; } return root;}data charupaixu(data root,int n)///递增插入排序{ data *p=&root,*pp=p->next; while(pp!=NULL) { if(pp->n>n) { data *s=(data *)malloc(sizeof(data)); s->n=n,s->next=pp; p->next=s; return root; } p=pp; pp=pp->next; } data *s=(data *)malloc(sizeof(data)); s->n=n,s->next=NULL; p->next=s; return root;}data dijianhebing(data root1,data root2)///递减合并{ root1=nizhi(root1); root2=nizhi(root2); data ROOT; ROOT.next=NULL; data *p=root1.next,*q=root2.next,*pp=&ROOT; while(p!=NULL||q!=NULL) { data *t=(data*)malloc(sizeof(data)); if(p!=NULL&&q!=NULL) { if(p->n>q->n) t->n=p->n, t->next=NULL,pp->next=t,p=p->next; else t->n=q->n,t->next=NULL,pp->next=t,q=q->next; } else if(p!=NULL) t->n=p->n, t->next=NULL,pp->next=t,p=p->next; else t->n=q->n,t->next=NULL,pp->next=t,q=q->next; pp=t; } root1=nizhi(root1); root2=nizhi(root2); return ROOT;}data dizenghebing(data root1,data root2)///递增合并{ data ROOT; ROOT.next=NULL; data *p=root1.next,*q=root2.next,*pp=&ROOT; while(p!=NULL||q!=NULL) { data *t=(data*)malloc(sizeof(data)); if(p!=NULL&&q!=NULL) { if(p->n<q->n) t->n=p->n, t->next=NULL,pp->next=t,p=p->next; else t->n=q->n,t->next=NULL,pp->next=t,q=q->next; } else if(p!=NULL) t->n=p->n, t->next=NULL,pp->next=t,p=p->next; else t->n=q->n,t->next=NULL,pp->next=t,q=q->next; pp=t; } return ROOT;}int main(){ int n; data root; cout<<"请输入链表1要输入元素的个数"<<endl; cin>>n; cout<<"请输入这"<<n<<"个元素"<<endl; root=shuru(n,root); cout<<endl; cout<<"遍历链表1的结果:"<<endl; bianli(root); cout<<endl; cout<<"请输入链表2要输入元素的个数"<<endl; cin>>n; data root2; cout<<"请输入这"<<n<<"个元素"<<endl; root2=shuru(n,root2); cout<<endl; cout<<"遍历链表2的结果:"<<endl; bianli(root2); cout<<endl; cout<<"建立非递减有序单向新链表1:"<<endl; data Root; Root.next=NULL; data *p=root.next; while(p!=NULL) { Root=charupaixu(Root,p->n); p=p->next; } bianli(Root); cout<<endl; cout<<"建立非递减有序单向新链表2:"<<endl; data Root2; Root2.next=NULL; p=root2.next; while(p!=NULL) { Root2=charupaixu(Root2,p->n); p=p->next; } bianli(Root2); cout<<endl; cout<<"将链表1和链表2合并成一个非递增链表:"<<endl; data ROOT=dijianhebing(Root,Root2); bianli(ROOT); cout<<endl; cout<<"将链表1和链表2合并成一个非递减链表:"<<endl; data ROOT0=dizenghebing(Root,Root2); bianli(ROOT0); cout<<endl; cout<<"逆置原链表1的结果:"<<endl; root=nizhi(root); bianli(root); root=nizhi(root); cout<<endl; cout<<"删除偶数节点后的链表1:"<<endl; root=shanoushu(root); bianli(root); cout<<endl; return 0;}
0 0
- 线性表的有关操作
- 线性表的有关操作
- 实验 线性表的有关操作
- 一 线性表的有关操作
- 数据结构实验1 线性表的有关操作
- (数据结构)实验一 线性表的有关操作
- 【C语言版数据结构】线性表的单链表有关的相关操作
- 详谈线性表的有关操作(Java、C两种语言)
- 表的有关操作
- 有关线性表的一些算法题
- 线性表的操作
- 线性表的操作
- 线性表的操作
- 线性表的操作
- 顺序表的有关操作
- 线性链表的操作
- 线性链表的操作
- 线性表的基本操作
- 用form表单上传
- Linux cat --连接文件或标准输出并打印
- Yeoman官网新手教程:第二章 下载Yeoman生成器
- AndroidHttp通信 HTTP Client与HttpURLConnection的区别
- 创建一个不断循环切换的动画
- 线性表的有关操作
- linux下打印带有颜色的字体
- Linux cd --更改当前工作目录
- 让创建按钮的大小和图片一样大
- java线程(7)——阻塞队列BlockingQueue
- VIM的全局替换
- 用js导出页面table到excel表中
- 做最好的自己,成为最好的女子
- 【暴侃IT圈】关于协助客户建立购物平台的骗局分析