单链表
来源:互联网 发布:珠海鲁班软件培训 编辑:程序博客网 时间:2024/06/18 04:07
#include<iostream>
#include<iomanip>
using namespace std;
#define OK 1
#define ERROR 0
typedef int Status;
typedef int ElemType;
//-------------单链表的存储结构--------------------
typedef struct LNode
{
ElemType data;//结点的数据域
struct LNode *next;//结点的指针域
}LNode,*LinkList;
//-------------单链表的初始化-----------------------
Status InitList_L(LinkList &L)
{
//构造一个空的链表L
L=new LNode;//生成新结点作为头结点,用头指针L指向头结点
L->next=NULL;//头结点的指针域置空
return OK;
}
//-------------按序号查找----------------------------------
Status GetElem_L(LinkList L,int i,ElemType &e)
{
//在带头结点的单链表L中查找第i个元素
LinkList p;
p=L->next;//初始化,p指向第一个结点
int j=1;//j为计数器
while(p&&j<i)//顺链域向后扫描,直到p指向第i个元素或p为空
{
p=p->next;
++j;
}
if(!p||j>i)//第i个元素不存在
return ERROR;
e=p->data;//取第i个元素
return OK;
}
//------------按值查找---------------------------------------
LNode* LocateElem_L(LinkList L,ElemType e)
{
//在带头结点的单链表L中查找值为e的元素
LNode* p;
p=L->next;
while(p&&p->data!=e)//寻找满足条件的结点
p=p->next;
return p;//返回L中值为e的元素的位置;查找失败的话返回NULL
}
//------------插入-------------------------------------------
Status ListInsert_L(LinkList &L,int i,ElemType &e)
{
LinkList p=L;
int j=0;
while(p&&j<i-1)
{
p=p->next;
++j;
}
if(!p||j>i-1)
return ERROR;
LinkList s;
s=new LNode;//生成新结点s
s->data=e;//将结点s的数据域置为e
s->next=p->next;//将结点s插入L中
p->next=s;
cout<<"插入完成"<<endl;
return OK;
}
//--------------单链表删除------------
Status ListDelete_L(LinkList &L,int i,ElemType e)
{
LinkList p=L;
LinkList q;
int j=0;
while(p&&j<i-1)//寻找第i-1个结点
{
p=p->next;
++j;
}
if(!(p->next)||j>i-1)
return ERROR;//i大于表长+1或小于1
q=p->next;//临时保存被删结点的地址以备释放
p->next=q->next;//改变删除结点前驱结点的指针域
e=q->data;
delete q;//释放删除结点的数据域
cout<<e<<"被删除"<<endl;
return OK;
}
//---------------前插法创建链表--逆序输入--------
void CreateList_F(LinkList &L,int n)
{
L=new LNode;
LinkList p;
L->next=NULL;//先建立一个带头结点的空链表
for(int i=n;i>0;--i)
{
p=new LNode;//生成新结点
cin>>p->data;//输入元素值
p->next=L->next;
L->next=p;//插入到表头
}
}
//--------------后插法创建链表--正序输入-----------
void CreateList_L(LinkList &L,int n)
{
L=new LNode;
LinkList p;
L->next=NULL;
LinkList r=L;//尾指针r指向头结点
for(int i=0;i<n;++i)
{
p=new LNode;//生成新结点
cin>>p->data;
p->next=NULL;
r->next=p;
r=p;//r指向新的结点
}
}
int main()
{
int choice;
int n;
int i;
ElemType e;
LNode *L;
cout<<"选项:"<<endl
<<setw(10)<<"1.创建"<<endl
<<setw(10)<<"2.查找"<<endl
<<setw(10)<<"3.插入"<<endl
<<setw(10)<<"4.删除"<<endl
<<setw(10)<<"0.退出"<<endl
<<"请选择:"<<endl;
cin>>choice;
while(i!=0)
{
switch(choice)
{
case 1:
{
int choice1;
InitList_L(L);
cout<<"1.前插法 2.后插法"<<endl
<<"请选择:"<<endl;
cin>>choice1;
switch(choice1)
{
case 1:
cout<<"请输入结点个数:"<<endl;
cin>>n;
cout<<"请输入元素值:"<<endl;
CreateList_F(L,n);
break;
case 2:
cout<<"请输入结点个数:"<<endl;
cin>>n;
cout<<"请输入元素值:"<<endl;
CreateList_L(L,n);
break;
default:
cout<<"输入有误"<<endl;
break;
}
break;
}
case 2:
{
int choice1;
cout<<"1.按序号查找 2.按值查找"<<endl
<<"请选择:"<<endl;
cin>>choice1;
switch(choice1)
{
case 1:
cout<<"请输入序号";
cin>>i;
GetElem_L(L,i,e);
cout<<"此结点数据域为:"<<e<<endl;
break;
case 2:
cout<<"请输入值:";
cin>>e;
cout<<"此数据的第一个位置为:"<<LocateElem_L(L,e)<<endl;
break;
default:
cout<<"输入有误"<<endl;
break;
}
break;
}
case 3:
cout<<"请输入位置:";
cin>>i;
cout<<"请输入数值:";
cin>>e;
ListInsert_L(L,i,e);
break;
case 4:
cout<<"请输入位置:";
cin>>i;
ListDelete_L(L,i,e);
break;
case 0:
return 0;
default:
cout<<"输入有误,请重新输入:"<<endl;
}
cout<<"请选择:";
cin>>choice;
}
return 0;
}
/*1105_XL*/
- 单链表
- 单链表
- 单链表
- 单链表
- 单链表
- 单链表
- 单链表
- 单链表
- 单链表
- 单链表
- 单链表
- 单链表
- 单链表
- 单链表
- 单链表
- 单链表
- 单链表
- 单链表
- C++ const精髓
- 瞎忙
- c++内存管理
- 5.6
- BNU16485:Build The Electric System(并查集)
- 单链表
- Cocos-2d 坐标系及其坐标转换
- TCP协议发送SKB时ip_summed初始值为0
- GIT在Linux上的安装和使用简介
- 【技术文档】《编程珠玑》Jon Bentley·第8章 算法设计技术
- Cuda编程总结--cuda c programming Guide
- linux设置PATH
- IIS7.0错误
- Option Explicit On 和Option Strict Off