顺序表和单链表基本操作的实现
1、顺序表的建立、取指定元素、返回指定元素位置。
2、顺序表中插入新元素、删除指定元素操作的实现。
3、单链表的建立、取指定元素、返回指定元素位置。
4、单链表中插入新元素、删除指定元素操作的实现。
/*
该主要完成单链表中基本操作的实现,单链表中的元素类型为整型,共包含以下9个操作:
1、void InitList(LinkList &L) //初始化单链表L
2、void CreateListF(LinkList &L,int n) //前插法建单链表,要求使用[1,100]内的随机整数填充单链表L,参数n表示要向表中填充几个数据
3、void CreateListR(LinkList &L,int n) //后插法建单链表,要求使用[1,100]内的随机整数填充单链表L,参数n表示要向表中填充几个数据
4、void CreateList(LinkList &L,int n) //创建一个值递增有序的单链表L
5、void PrintList(LinkList L) //输出单链表L 中各结点的值
6、int ListLength(LinkList L) //求单链表L的长度
7、LNode *LocateElem(LinkList L,int e) //在单链表L 中查找元素e的位置,查找成功,返回指向e的指针
8、bool ListInsert(LinkList &L,int i,int e) //在单链表L的第i个结点前插入一个新元素e,插入成功,返回true,插入失败,返回false
9、bool ListDelete(LinkList &L,int i,int &e) //删除单链表L中第i 个结点,被删元素用参数e返回,删除成功,函数返回true,删除失败,函数返回false
本实验完成以后,请自行在此实验的基础上补充单链表其它基本操作的实现(例如:ClearList、PutElem、DestroyList、PriorELem、NextElem、GetElem等)
*/
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList; //单链表表结构
//初始化单链表L
void InitList(LinkList &L)
{
L=new LNode;//请同学们在此处把该操作补充完整
L->next=NULL;
}
//前插法建表,要求使用[1,100]内的随机整数填充单链表L,参数n表示要向表中填充几个数据
//提示:生成[1,100]内的随机整数公式为: rand()%100+1 ,在使用rand()函数前要先使用srand(time(0))设置随机数种子
void CreateListF(LinkList &L,int n)
{
int i;
LinkList p;
srand(time(0));
L = (LNode *)malloc(sizeof(LNode));//请同学们在此处把该操作补充完整,然后再main里面调用并调试
L->next=NULL;
for(i=0;i<n;i++)
{
p = (LinkList)malloc(sizeof(LNode));
p->data=rand() % 100 + 1 ;
p->next=L->next;
L->next=p;
}
}
//后插法建表,要求使用[1,100]内的随机整数填充单链表L,参数n表示要向表中填充几个数据
void CreateListR(LinkList &L,int n)
{
int i;
LinkList p;
srand(time(0));
L = (LNode *)malloc(sizeof(LNode));//请同学们在此处把该操作补充完整,然后再main里面调用并调试
L->next=NULL;
LinkList r;
r = (LNode *)malloc(sizeof(LNode));;
r=L;
for(i=0;i<n;++i)
{
p = (LNode *)malloc(sizeof(LNode));
p->data=rand()%100+1;
p->next=NULL;
r->next=p;
r=p;
}
}
//选做
//创建一个值递增有序的单链表,请同学们补充此操作
void CreateList(LinkList &L,int n)
{
LNode *p=L->next,*pre;
LNode *r=p->next; //r保持*p后继结点指针,以保证不断链
p->next=NULL;
p=r;
while(p!=NULL){
r=p->next; //保护*p的后继的结点指针
pre=L;
while(pre->next!=NULL && pre->next->data < p->data)
pre=pre->next; //在有序表中查找插入*p的前驱结点*pre
p->next=pre->next;
pre->next=p;
p=r;
}
}
//输出单链表L 中各结点的值
void PrintList(LinkList L)
{
LNode *p = L->next;
while(p!=NULL)
{
printf("%d ", p->data);
p=p->next;
} //请同学们在此处把该操作补充完整,并调试
}
//求单链表L的长度
int ListLength(LinkList &L)
{
LNode *p;
int count=0;
p=L->next;
while(p)
{
count++;
p=p->next;
} //请同学们在此处把该操作补充完整,并调试
return count;
}
//在单链表L 中查找元素e的位置,查找成功,返回指向e的指针
LNode *LocateElem(LinkList L,int e)
{
LNode *p;
p=L->next;//请同学们在此处把该操作补充完整,并调试
while(p && p->data!=e)
p=p->next;
return p;
}
//在单链表L的第i个结点前插入一个新元素e,插入成功,返回true,插入失败,返回false
bool ListInsert(LinkList &L,int i,int e)
{
L = (LNode *)malloc(sizeof(LNode));
LNode *p;//请同学们在此处把该操作补充完整,并调试
p = (LNode *)malloc(sizeof(LNode));
p=L;
int j=0;
while(p && (j<i-1))
{ p=p->next;
++j;
}
if(!p||j>i-1) return false;
LNode *s;
s = (LNode *)malloc(sizeof(LNode));;
s->data=e;
s->next=p->next;
p->next=s;
return true;
}
//删除单链表L中第i 个结点,被删元素用参数e返回,删除成功,函数返回true,删除失败,函数返回false
bool ListDelete(LinkList &L,int i,int &e)
{
LNode *p;//请同学们在此处把该操作补充完整,并调试
p=L;
int j=0;
while(p && (j<i-1))
{ p=p->next;
++j;
}
if(!(p->next)||(j>i-1) ) return false;
LNode *q;
q=p->next;
p->next=q->next;
e=q->data;
delete q;
return true;
}
//操作菜单
void showmenu()
{
cout<<endl;
cout<<"**************************顺序表基本操作*************************"<<endl;
cout<<"1、头插法建表"<<endl;
cout<<"2、尾插法建表"<<endl;
cout<<"3、求单链表长度"<<endl;
cout<<"4、在单链表中查找指定元素"<<endl;
cout<<"5、在单链表中第i个结点前插入一个新结点"<<endl;
cout<<"6、删除单链表中第i个结点"<<endl;
cout<<"7、输出单链表"<<endl;
cout<<"8、退出"<<endl;
cout<<endl;
}
int main()
{
LinkList L; //定义单链表的头指针L
int n,e,pos,flag,k;
LNode *p;
InitList(L); //初始化单链表L
cout<<"单链表L初始化成功"<<endl;
//循环显示菜单,完成顺序栈的一系列操作
do{
showmenu();
cout<<"请选择要执行的操作序号"<<endl;
cin>>k; //k表示用户选择的操作序号
switch(k)
{
case 1: //执行入栈操作
cout<<"请输入要创建的单链表的长度"<<endl;
cin>>n; //变量n表示要输入到单链表中的元素个数
CreateListF(L,n); //向L中填充n个随机整数
cout<<"单链表L创建成功!"<<endl;
break;
case 2: //执行出栈操作
cout<<"请输入要创建的单链表的长度"<<endl;
cin>>n; //变量n表示要输入到单链表中的元素个数
CreateListR(L,n); //向L中填充n个随机整数
cout<<"单链表L创建成功!"<<endl;
break;
case 3: //输出顺序栈的长度及栈中的元素
cout<<"单链表L的长度为:"<<ListLength(L)<<endl;
break;
case 4: //输出栈顶元素
cout<<"请输入要查找的元素的值"<<endl;
cin>>e; //变量e表示要查找的元素
p=LocateElem(L,e); //在L中查找元素e的位置,p表示查找结果,或为NULL,或为非NULL
if(p) cout<<"查找成功"<<endl;
else cout<<"表中没有值为"<<e<<"的结点"<<endl;
break;
case 5: //输出栈顶元素
cout<<"请输入插入位置及插入的值"<<endl;
cin>>pos>>e; //输入向L中插入元素的位置及值
flag=ListInsert(L,pos,e); //在单链表L的第pos个位置插入值e,flag表示插入操作结果,或为true,或为false
if(flag) //判断插入操作是否成功
cout<<"插入操作成功!"<<endl;
else
cout<<"插入失败!"<<endl;
break;
case 6: //输出栈顶元素
cout<<"请输入删除元素的位置"<<endl;
cin>>pos; //输入删除位置
flag=ListDelete(L,pos,e); //删除单链表L中第pos个元素,被删元素的值用e返回,flag表示删除操作结果,或为true,或为false
if(flag) //判断删除操作是否成功
cout<<"删除操作成功,被删元素为:"<<e<<endl; //输出被删元素的值
else
cout<<"删除位置错误,操作失败!"<<endl;
break;
case 7:
cout<<"表中元素为:"<<endl;
PrintList(L); //输出顺序表L中的元素
break;
case 8:
cout<<"谢谢使用,再见!"<<endl;
break;
default:
cout<<"操作序号错误,请输入正确的操作序号!"<<endl;
break;
}//switch
}while(k!=8);
return 1;
}
顺序表和单链表基本操作的实现相关推荐
- 数据结构实验二——建立具有至少10个元素的顺序表或单链表,并能对该表进行查找、删除等基本操作。
结合实际应用,建立具有至少10个元素的顺序表或单链表,并能对该表进行查找.删除等基本操作. //主函数 #include"Sq.h" #include<stdio.h> ...
- 数据结构----顺序表与单链表(JAVA)
下面为学习顺序表和单链表的一些基本操作函数: 1 public class SeqList<T> extends Object { 2 protected int n; 3 protect ...
- 数据结构——线性表:顺序表、单链表、双链表(C++)
内容概要: 1.代码部分: 线性表抽象类 顺序表类 单链表类 双链表类 主函数 2.基本概念及注意事项 代码(测试环境VS2017): //线性表ADT类的定义:ADT_List.htemplate ...
- 数据结构个人笔记 第三课 顺序表和单链表
数据结构个人笔记 第三课 顺序表和单链表 顺序表的基本操作 插入元素 删除元素 顺序表查找元素 顺序表更改元素 本节总结代码 单链表 链表的节点 头节点.头指针和首元结点 链表的创建(初始化) 本节总 ...
- 逆置单链表c语言程序,(数据结构C语言版)顺序表和单链表的逆置
<(数据结构C语言版)顺序表和单链表的逆置>由会员分享,可在线阅读,更多相关<(数据结构C语言版)顺序表和单链表的逆置(7页珍藏版)>请在人人文库网上搜索. 1.实验1-1顺序 ...
- 线性表之顺序表与单链表的区别及优缺点
这里比较的是基于C语言实现的顺序表与单链表,与其他语言的实现可能会有差异,但我相信语言是相通的,它们的实现机制应该也差不多. 1.What 什么是顺序表和单链表 ①顺序表: 顺序表是在计算机内存中以数 ...
- java如何给顺序表赋值_JAVA模拟新增顺序表及单链表
最近在回顾大学学的数据结构,这里给大家用javwww.cppcns.coma模拟顺序表和单链表的新增 1顺序表新增 /** * 顺序www.cppcns.com表 * * @author cjd * ...
- 顺序表和单链表的插入删除操作时间复杂度的区别
顺序表和单链表的插入删除操作时间复杂度的区别 最近在学习数据结构,看到如果需要用到大量的插入和删除操作,单链表的效率会高于顺序表.看到这里时内有有个疑惑,这两种数据结构的插入和删除操作的时间复杂度不都 ...
- 数据结构顺序表和单链表优缺点
1:顺序表的优缺点:List 优点:顺序表示用地址连续的存储单元顺序存储线性表中的各个元素,逻辑上相领的数据元素在物理位置上也相领,因此,在顺序表中查找任何一个位置上的数据元素非常方便: 缺点:在顺序 ...
最新文章
- 李彦宏首次公布24字百度愿景,要做最懂用户的公司
- 理解SharePoint中的Managed Path
- C# 系统应用之Cookie\Session基础知识及php读取Cookie\Session
- oracle快速了解法,【oracle】rownum的快速了解
- const数组,strstr,strstr,
- c# xmlhttp POST提取远程webservice数据
- @Entity,@Indexed @XmlRootElement
- Android 开发之 fill_parent、wrap_content和match_parent的区别
- docker登录密码错误_Docker安装运行Mysql 5.7.31容器并修改数据库密码
- Java知多少(51)finally
- 密封槽设计标准_密封槽设计标准
- 【历史上的今天】9 月 3 日:谷歌发布 Android 10;微软收购诺基亚;eBay 诞生
- Linux-网络管理
- Linux基础8-TCP的面向链接(三次四次)
- 起底知网:大发学术财?学术富士康?定位偏差的知识工程?
- 前端构建工具gulpjs的使用介绍及技巧
- 敏捷开发的Scrum晨会实践
- c++/mfc 播放音乐,视频文件
- java API学习记录
- 【学习记录】图片局部放大