链式表的实现

#include<iostream>
using namespace std;
#include<string>
typedef int Status;
#define OK 1
#define ERROR 0
#define ElemType int
typedef struct  LNode
{
      ElemType   data;  // 数据域
      struct LNode   *next;  // 指针域
 } LNode, *LinkList;  


Status InitList_L(LinkList &L){ 
   L=new LNode;                        
   L->next=NULL;
   return OK; 
} 

Status DestroyList_L(LinkList &L){
    LinkList p;
       while(L)
        {
            p=L;  
            L=L->next;
            delete p;  
        }
     return OK;
 }

Status ClearList(LinkList & L){
  // 将L重置为空表 
   LinkList p,q;
   p=L->next;   //p指向第一个结点
   while(p)       //没到表尾 
      {  q=p->next; delete p;     p=q;   }
   L->next=NULL;   //头结点指针域为空 
   return OK;
 }


int  ListLength_L(LinkList L){
//返回L中数据元素个数
    LinkList p;
    p=L->next;         //p指向第一个结点
     int i=0;             
     while(p){           //遍历单链表,统计结点数
           i++;
           p=p->next;    } 
    return i;                             
 }


int ListEmpty(LinkList L){ 
//若L为空表,则返回1,否则返回0 
   if(L->next)   //非空 
     return 0;
   else
     return 1;
}



Status GetElem_L(LinkList L,int i,ElemType &e){ 
    LinkList p=L;
    p=L->next;   
    int j=1; //初始化
     while(p&&j<i){    //向后扫描,直到p指向第i个元素或p为空 
       p=p->next; ++j; 
     } 
     if(!p || j>i)return ERROR; //第i个元素不存在 
     e=p->data; //取第i个元素 
     return OK; 
}



LNode *LocateElem(LinkList L,ElemType e)
{
    LNode *p=L;
    while(p&&(p->data!=e))
    {
        p=p->next;
    }
    return p;
}



Status ListInsert_L(LinkList &L,int i,ElemType e){ 
      LinkList p;
      LNode* s;
      p=L;
      int j=0; 
      while(p&&j<i-1){p=p->next;++j;}    //寻找第i−1个结点 
      if(!p||j>i-1)return ERROR;    //i大于表长 + 1或者小于1  
      s=new LNode;            //生成新结点s 
      s->data=e;                         //将结点s的数据域置为e 
      s->next=p->next;                     //将结点s插入L中 
      p->next=s; 
      return OK; 
}



 Status ListDelete_L(LinkList &L,int i,ElemType &e){
    LinkList p;
    LinkList q;
    p=L;int j=0; 
    while(p->next &&j<i-1){//寻找第i-1个结点,并令p指向其前驱 
        p=p->next; ++j; 
    } 
    if(!(p->next)||j>i-1) return ERROR; //删除位置不合理 
    q=p->next; //临时保存被删结点的地址以备释放 
    p->next=q->next;     //改变删除结点前驱结点的指针域 
    e=q->data;     //保存删除结点的数据域 
    delete q;     //释放删除结点的空间 
 return OK; 
}
 //遍历输出函数
void PrintList(LinkList L)
{
    LinkList p=L->next;//跳过头结点
    if(ListLength_L(L))
    {
        printf("当前单链表所有元素:");
        while(p)
        {
            printf("%d ",p->data);
            p=p->next;
        }
        printf("\n");
    }
    else
    {
        printf("当前单链表已空!\n");
    }
}

 int main()
 {
     int i;
      LinkList L;int mount;
      ElemType e=0;
      InitList_L(L);
      for(;;)
      {
          cout<<"遍历0,查询请输入1,查找输入2,插入输入3,删除输入4,退出输入5"<<endl;
          cin>>mount;
          switch(mount)
          {
          case 0:
               PrintList(L);
               break;
          case 1:
              cout<<"请输入你想获取第几个的数据"<<endl;
              cin>>i;
              GetElem_L(L,i,e);
              cout<<"其数据为:"<<e;break;
          case 2:
              cout<<"请输入你想查找的数据"<<endl;
              cin>>e;
              if(LocateElem(L,e)!=NULL)
              {
                 cout<<"该数在第"<<LocateElem(L,e)<<"个"<<endl;
              }
              break;
          case 3:
              cout<<"请输入你想要插入到第几个位置"<<endl;
              cin>>i;
              cout<<"输入插入的数值为:";
              cin>>e;
              ListInsert_L(L,i,e);
              break;
         case 4:
              cout<<"请输入你想删除第几个数据"<<endl;
              cin>>i;
              ListDelete_L(L,i,e);
              cout<<"删除的数据为"<<e<<endl;
              break;
          }
    if(mount==5)
        break;
      }
    
 }

 

posted @ 2020-10-02 19:41  陈涵  阅读(223)  评论(0编辑  收藏  举报