单链表

来源:互联网 发布:珠海鲁班软件培训 编辑:程序博客网 时间: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*/