链表

https://blog.csdn.net/Endeavor_G/article/details/80552680

https://blog.csdn.net/qq_39993896/article/category/7319745

这个详细

顺序表:https://blog.csdn.net/lady_killer9/article/details/82695770

//链表
typedef struct LNode *List;
struct LNode{
    ElementType Data;
    List Next;
};
struct LNode L;
List PtrL;

//建有头结点链表
List creatlist(int n){
    List Head,Node,End;
    Head = (List)malloc(sizeof(struct LNode));
    End = Head;
    for(int i=0; i<n; i++){
        Node = (List)malloc(sizeof(struct LNode));
        scanf("%d",&Node->Data);
        End->Next = Node;
        End = Node;
    }
    End->Next = NULL;
    return Head;
}

//建立无头结点链表
List creat0list(int n){
    List Head,End;
    ElementType X;
    while(n--){
        scanf("%d",&X);
        List Node;
        Node = (List)malloc(sizeof(struct LNode));
        Node->Data = X;
        Node->Next = NULL;
        if(Head == NULL){
            Head = Node;
            End = Head;
        }
        else{
            End->Next = Node;
            End = Node;
        }
    }
    return Head;
}

//求表长
int Length(List PtrL){
    List p = PtrL;
    int j = 0;
    while(p){
        p = p->Next;
        j++;
    }
    return j;
}
//查找,按序号第k个
List FindKth(int K,List Ptrl){
    List p = PtrL;
    int i = 1;
    while(p && i<K){
        p = p->Next;
        i++;
    }
    if(i == K)
        return p;
    else
        return NULL;
}
//查找,按值查找
List Find(ElementType X,List PtrL){
    List p = PtrL;
    while(p && p->Data != X){
        p = p->Next;
    }
    return p;
}
//插入,插在第i-1结点的后面
List Insert(ElementType X,int i,List PtrL){
    List s,p;
    if(i == 1){
        s=(List)malloc(sizeof(struct LNode));
        s->Data=X;
        s->Next = PtrL;
        return s;
    }
    p = FindKth(i-1,PtrL);
    if(p == NULL){
        printf("位置错误");
        return NULL:
    }
    else{
        s = (List)malloc(sizeof(struct LNode));
        s->Data = X;
        s->Next = p->Next;
        p->Next = s;
        return PtrL;
    }
}
//删除,删第i个结点
List Delete(int i,List PtrL){
     List s,p;
     if(i == 1){
        s = PtrL;
        if(PtrL != NULL)
            PtrL = PtrL->Next;
        else 
            return NULL;
        free(s);
        return Ptrl;
     }
     p = FindKth(i-1,List PtrL);
     if(p == NULL){
        printf("位置错误");//删的前面的没有
        return NULL;    
     }
     else if(p->Next == NULL){
        printf("位置错误");//要删的没有
        return NULL;
     }
     else{
        s = p->Next;
        p->Next = s->Next;
        free(s);
        return PtrL; 
     }
}

 双向链表

typedef struct LNode *List;
struct LNode{
    int Data;
    List Next;
    List Prex;
};
struct LNode L;
List PtrL;

//建无表头
List creatlist(int n){
    List Head=NULL,Node=NULL,End=NULL;
    int X;
    while(n--){
        scanf("%d",&X);
        List Node;
        Node = (List)malloc(sizeof(struct LNode));
        Node->Data = X;
        Node->Next = NULL;
        Node->Prex = End;
        if(Head == NULL){
            Head = Node;
            End = Head;
        }
        else{
            End->Next = Node;
            End = Node;
        }
    }
    return Head;
}

List FindKth(int K,List PtrL){
    List p = PtrL;
    int j = 1;
    while(p && j<K){
        p = p->Next;
        j++;
    }
    if(j == K){
        return p;
    }
    else
        return NULL;
}


//前遍历
void printlist(List PtrL){
    List p = PtrL;
    while(p != NULL){
        printf("%d\t",p->Data);
        p = p->Next;
    }
}

//插入,把X插在i-1结点后
List Insert(int X,int i,List PtrL){
    List s,p;
    if(i == 1){
        s = (List)malloc(sizeof(struct LNode));
        s->Data = X;
        s->Next = PtrL;
        s->Prex = NULL;
        return s;
    }
    p =  FindKth(i-1,PtrL);
    if(p == NULL){
        printf("位置错误\n");
        return NULL;
    }
    else if(p->Next == NULL){
        s = (List)malloc(sizeof(struct LNode));
        s->Data = X;
        s->Next = p->Next;
        s->Prex = p;
        p->Next = s;
        return PtrL;
    }
    else{
        s = (List)malloc(sizeof(struct LNode));
        s->Data = X;
        p->Next->Prex = s;
        s->Next = p->Next;
        s->Prex = p;
        p->Next = s;
        return PtrL;
    }
}

//删除,删第i个
List Deletelist(int i,List PtrL){
    List p;
    p = PtrL;
    i--;
    while(i--){
        p = p->Next;
    }
    p->Prex->Next = p->Next;
    p->Next->Prex = p->Prex;
    free(p);
    return PtrL;
}
posted @ 2019-09-17 21:38  acwarming  阅读(147)  评论(0编辑  收藏  举报