链表的基本操作
来源:互联网 发布:董方卓为什么废了知乎 编辑:程序博客网 时间:2024/06/01 08:48
/*程序的版权和版本声明部分:*Copyright(c)2014,烟台大学计算机学院学生*All rights reserved.*文件名称:*作者:田成琳*完成日期:2014 年 9 月 8 日*版本号:v1.0*对任务及求解方法的描述部分:*问题描述:链表的简单应用*程序输入: -*程序输出:链表值*问题分析:*算法设计:*/#include<iostream>#include<cstdlib>using namespace std;struct LinkList{ int data; struct LinkList *next;};void InitList(LinkList *&L);//初始化链表void CreateListF(LinkList *&L,int array[],int n);//头插法建立链表void CreateListR(LinkList *&L,int array[],int n);//尾插法建立链表 void DestoryList(LinkList *&L);//销毁链表bool ListEmpty(LinkList *L);//判段链表是否为空int ListLength(LinkList *L);//返回链表节点个数void DisplayList(LinkList *L);//输出链表每个节点的值bool GetElem(LinkList *L,int i,int &e);//查找某节点,其值赋给eint LocateElem(LinkList *L,int e);//查找某值,存在返回逻辑序号,否则返回0bool ListInsert(LinkList *&L,int i,int e);//插入元素bool ListDelete(LinkList *&L,int e);//删除元素void InitList(LinkList *&L){ L=(LinkList *)malloc(sizeof(LinkList)); L->next=NULL;}void CreateListF(LinkList *&L,int array[],int n){ LinkList *s; L=(LinkList *)malloc(sizeof(LinkList)); L->next=NULL; //创建头结点 for(int i=0;i<n;i++)//循环创建链表 { s=(LinkList *)malloc(sizeof(LinkList)); s->data=array[i]; s->next=L->next; L->next=s; }}void CreateListR(LinkList *&L,int array[],int n){ LinkList *s,*r; L=(LinkList *)malloc(sizeof(LinkList)); r=L; for(int i=0;i<n;i++) { s=(LinkList *)malloc(sizeof(LinkList)); s->data=array[i]; r->next=s; r=s; } r->next=NULL;}void DestoryList(LinkList *&L)//释放空间要逐一释放{ LinkList *pre=L,*p=L->next;//pre指向p的前驱节点 while(p!=NULL)//扫描L { free(pre);//先释放上一个节点 pre=p; p=pre->next;//pre,p同时向后移动一个节点 } free(pre);//循环结束,p为NULL,pre指向尾节点}bool ListEmpty(LinkList *L){ return (L->next==NULL);}int ListLength(LinkList *L){ int n=0; LinkList *p=L; while(p->next!=NULL) { n++; p=p->next; } return n;}void DisplayList(LinkList *L){ LinkList *p=L->next;//p指向开始节点 while(p!=NULL) { cout<<p->data<<" "; p=p->next; } cout<<endl;}bool GetElem(LinkList *L,int i,int &e){ int j=0; LinkList *p=L; while(j<i&&p!=NULL) { j++; p=p->next; } if(p==NULL) return false; else { e=p->data; return true; }}int LocateElem(LinkList *L,int e){ int i=1; LinkList *p=L->next; while(p!=NULL&&p->data!=e) { i++; p=p->next; } if(p==NULL) return (0); else return (i);}bool ListInsert(LinkList *&L,int i,int e){ int j=0; LinkList *p=L,*s; while(j<i-1&&p!=NULL) { j++; p=p->next; } if(p==NULL) return false; else { s=(LinkList *)malloc(sizeof(LinkList)); s->data=e; s->next=p->next; p->next=s; return true; }}bool ListDelete(LinkList *&L,int e){ LinkList *p=L,*q; while(p->next->data!=e&&p!=NULL) p=p->next; if(p==NULL)//链表为空 return false; else //找到了删除的前驱节点 { q=p->next; //q指向要删除的节点 if(q==NULL) return false; p->next=q->next; free(q); return true; }}int main(){ LinkList *L; int n,choose,del,ins,position; cout<<"请输入要插入链表中值的个数:"<<endl; cin>>n; int *array = new int[n]; cout<<"请输入要插入链表中的值:"<<endl; for(int i=0;i<n;i++) cin>>array[i]; cout<<"请选择插入方法:"<<endl; cout<<"1.正序插入"<<endl; cout<<"2.倒序插入"<<endl; cin>>choose; if(choose==2) CreateListF(L,array,n); if(choose==1) CreateListR(L,array,n); if(ListEmpty(L)) cout<<"链表为空!"<<endl; else { cout<<"链表不为空,链表中的值为:"<<endl; DisplayList(L); } cout<<"请输入要插入链表元素的位置及元素"<<endl; cin>>position>>ins; ListInsert(L,position,ins); cout<<"插入后链表中的值为:"<<endl; DisplayList(L); cout<<"请输入要删除链表的元素:"<<endl; cin>>del; ListDelete(L,del); cout<<"删除后链表中的值为:"<<endl; DisplayList(L); return 0;}
运行结果:
0 0
- 链表的基本操作
- 链表的基本操作
- 链表的基本操作
- 链表的基本操作
- 链表的基本操作
- 链表的基本操作
- 链表的基本操作
- 链表的基本操作
- 链表的基本操作
- 链表的基本操作
- 链表的基本操作
- 链表的基本操作
- 链表的基本操作
- 链表的基本操作
- 链表的基本操作
- 链表的基本操作
- 链表的基本操作
- 链表的基本操作
- 动态规划解各种子序列问题
- C++类中的静态数据成员--static
- 【ThinkingInC++】42、类里的const
- VC多线程编程初步
- unordered_map
- 链表的基本操作
- android多线程下载以及断点续传
- 并发编程--在执行器中延迟执行任务
- 原生JS实现淡入淡出效果(fadeIn/fadeOut/fadeTo)
- 虚拟机上redhat5.8利用系统盘镜像创建yum包
- 【开源夏令营】6lowpan阅读笔记
- C#自动保存控件大小和位置,C#自动保存窗体大小和位置
- 广东电信 GOPN 光猫研究
- NDK 原生代码处理图形