线性表的链式存储实现

typedef struct LNode *List;
  struct LNode{
      ElementType Data[MAXSIZE];
      int Last;
  };
  struct LNode L;
  List PtrL;


//1.求表长
int Length(List PtrL)
{
    List p = PtrL;  /*p指向表的第一个结点*/
    int j = 0;
    while(p){
        p = p->Next;
        j++;        /*当前p指向的是第j个结点*/
    }
    return j;
}


//2.查找
//(1)按序号查找:FindKth;
List FindKth(int K,List PtrL)
{
    List p = PtrL;
    int i=1;
    while(p!=NULL && i < K){
        p = p->Next;
        i++;
    }
    if(i==K)   
        return p;   /*找到第K个,返回指针*/
    else   
        return NULL /*否则返回空*/
}

//3.按值查找    Find
List Find(ElementType X,List PtrL)
{
    List p = PtrL;
    while( p!=NULL && p->Data !=X)
        p = p->Next;
    return p;
}
3.插入(在第i-1个(1<=i && i<=n+1)个结点后插入一个值为X的新结点

 

 

//插入操作实现
List lnsert(ElementType X,int i,List PtrL)
{
    List p,s;
    if(i==1){                                    /*新结点插入在表头*/
        s = (List)malloc(sizeof(struct LNode)); /*申请、填装结点*/
        s->Data = X;
        s->Next = PtrL;
        return s;                               /*返回新表头指针*/
    }
    p = FindKth(i-1,PtrL);                      /*查找第i-1个结点*/
    if(p==NULL){                                /*dii-1个不存在,不能插入*/
        printf(" 参数i错 “);
        return NULL;
    }
    else{
        s = (List)malloc(sizeof(struct LNode)); /*申请、填装结点*/
        s->Data = X;
        s->Next = p->Next;          /*新结点插入在第i-1个结点的后面*/
        p->Next = s;
        return PtrL;
    }
}
 //4.删除(删除链表的第i(1<=i && i<=n)个位置上的结
List Delete(int i,List PtrL)
{
    List p,s;
    if(i==1){       /*若要删除的是表的第一个结点*/
        s = PtrL;           /*s指向第1个结点*/
        if(PtrL!=NULL)
            PtrL = PtrL->Next;      /*从链表中删除*/
        else
            return NULL;
        free(s);                    /*释放被删除结点*/
        return PtrL;
    }
    p = FindKth(i-1,PtrL);          /*查找第i-1个结点*/
    if(p == NULL){
        printf("第%d个结点不存在",i-1);
        return NULL;
    }
    else if(p->Next == NULL){
        printf("第%d个结点不存在",i);
        return NULL;
    }
    else{
        s = p->Next;                /*指向第i个结点*/
        p->Next = s->Next;          /*从链表中删除*/
        free(s);                    /*释放被删除结点*/
        return PtrL;
    }
}

 

posted @ 2019-03-10 10:31  殇之弑梦  阅读(316)  评论(0编辑  收藏  举报