链表的基本操作
2014-09-08 15:38
489 查看
/*程序的版权和版本声明部分: *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);//查找某节点,其值赋给e int LocateElem(LinkList *L,int e);//查找某值,存在返回逻辑序号,否则返回0 bool 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 ; 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; }
运行结果:
相关文章推荐
- 算法(05):基本链表的操作及双向链表
- 链表的基本操作
- 双链表基本操作
- 带头结点的单链表的12个基本操作
- C++链表基本操作
- 链表的基本操作
- 单链表的基本操作
- bo2-8.cpp 不带头结点的单链表(存储结构由c2-2.h定义)的部分基本操作(9个)
- bo2-4.cpp设立尾指针的单循环链表(存储结构由c2-2.h定义)的12个基本操作
- 单链表和双链表上的基本操作
- 数据结构类型定义及基本操作汇总(一)--线性表,单链表,栈和队列
- 用C语言编写一个包含链表的初始化、插入、删除、查找等基本操作的程序。
- 链表队列与二叉树基本操作
- bo2-9.cpp 不带头结点的单链表(存储结构由c2-2.h定义)的部分基本操作(2个)
- 链表的基本操作
- 单链表的基本操作
- 双向循环链表的基本操作
- 单链表基本操作c语实现
- 链表的一些基本操作
- 链表的基本操作