目的要求:
⑴掌握单向链表的存储特点及其实现。
⑵掌握单向链表的插入、删除算法及其应用算法的程序实现。
实验内容:
⑴随机产生或键盘输入一组元素,建立一个带头结点的单向链表(无序)。
⑵遍历单向链表。
⑶把单向链表中元素逆置(不允许申请新的结点空间)。
⑷在单向链表中删除所有的偶数元素结点。
⑸编写在非递减有序链表中插入一个元素使链表元素仍有序的函数,并利用该函数建立一个非递减有序单向链表。
⑹利用算法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; }