线性表——单链表的基本操作

/**********************************************************
*  单链表的存储结构定义 
***********************************************************/
typedef struct LNode {
    ElemType data;
    struct LNode *next;
} LNode, *LinkList;
/**********************************************************
*  单链表的基本操作的实现
***********************************************************/

//创建并初始化为空表 
Status InitList(LinkList &L)
{     L=(LNode*)malloc(sizeof(LNode));
     if(L==NULL) return ERROR;
	  L->next=NULL;
	   return OK;
}

//销毁整个表(从此之后不再可用) 
Status DestroyList(LinkList &L)
{
    // TODO (#1#): 销毁表 
    return ERROR;
    //-------------------------------------
}

//将表L置空 
Status ClearList(LinkList &L)
{   L->next=NULL;
    return OK;
}

//判断表L是否为空表 
bool ListEmpty(LinkList L)
{   if(L->next==NULL) return true;
    return false;
    //-------------------------------------
}

//求表L的长度 
int ListLength(LinkList L)
{   LNode* p=L->next; 
    int j=0;
	while(p||p!=NULL) 
	{p=p->next;
	 j++;
	}
    return j;
}

//取表L中的第i个元素,并用e返回. 操作成功返回OK,失败时返回ERROR 
Status GetElem(LinkList L, int i, ElemType &e)
{   LNode* p=L->next;
    int j=1;
    while(p||j<i)
	{ p=p->next;
	   j++;
	}
     if(!p||j>i) return ERROR;
	   e=p->data;
	   return OK;
    //-------------------------------------
}

//在表L中定位元素e首次出现的位置. 操作成功返回位序,失败时返回0 
//    compare(a,b) 为比较函数,匹配时返回true,否则返回false 
int LocateElem(LinkList L, ElemType e, bool (*compare)(ElemType,ElemType))
{  int j=1;   
   LNode* p = L->next; 
   while(p!=NULL) {
      if( compare(p->data,e) )  return j;
        p=p->next;
	    j++;
   }
       return 0;

}


//在表L中插入第i个元素e. 操作成功返回OK,失败时返回ERROR
Status ListInsert(LinkList &L, int i, ElemType e)
{   LNode* p=L;
	int j=0 ;
   while(p&&j<i-1)
   {p=p->next;
    j++;
   }
   if(!p||j>i-1) return ERROR;
   LNode* s=(LNode*)malloc(sizeof(LNode));
   s->data=e;
   s->next=p->next;
   p->next=s;
  return OK;
}

//删除表L中第i个元素,结果用e返回. 操作成功返回OK,失败时返回ERROR 
Status ListDelete(LinkList &L, int i, ElemType &e)
{    LNode* p=L->next;
   int j=1;
   while(p&&j<i-1)
   {p=p->next;
    j++;
   }
   if(!p||j>i-1) return ERROR;
   p->next=p->next->next;
   free(p);
   return OK;
}

//遍历表L,对每个元素调用visit(x). 
Status ListTraverse(LinkList L, Status (*visit)(ElemType))
{
    LinkList p = L->next;
    while ( p ) {
        if ( visit(p->data)==ERROR )  return ERROR;
        p = p->next;
    }
    return OK;
}

 

posted @ 2017-11-27 08:11  北有孤鹜  阅读(285)  评论(0编辑  收藏  举报