赞
踩
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;
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。