线性表之单链表

作者: yhcheer | 来源:发表于2017-09-24 00:14 被阅读0次

    对比了好几本书,比较少涉及单链表的赋值,为了亲自跑出其他功能,花了不少时间,毕竟是打基础嘛,相信以后会越来熟练(你为什么那么熟练^ ^)话不多说,下面是代码及实验结果。
     


    这里写图片描述
    #include <cstdio>
    #include <cstdlib>
    #define  ElementType int
    #define MAXSIZE 1000
    #define ERROR -1
    
    
    /*线性表-顺序表-结构体定义*/
    typedef struct LNode *PtrToLNode;
    struct LNode {
        ElementType Data;
        PtrToLNode Next;                                       /*最后一个位置下标,用来计算顺序表的长度*/
    };
    struct LNode L;
    PtrToLNode PtrL = &L;
    
    
    
    /*初始化-赋值*/
    PtrToLNode CreatNewList(PtrToLNode PtrL , int data){
        PtrToLNode q = PtrL;
        PtrToLNode p = (PtrToLNode)malloc(sizeof(struct LNode));
        p->Next = NULL;
        p->Data = data;
        if( NULL == PtrL ){
            PtrL = p;
        }
        else{
            while(q->Next)
                q = q->Next;
            q->Next = p;
        }
        return PtrL;
    }
    
    /*遍历-打印*/
    int ShowNewList(PtrToLNode PtrL ){
        PtrToLNode p = PtrL;
        while(p){
            printf("%d",p->Data);
            p = p->Next;
        }
        printf("\n");
        return 1;
    }
    
    /*遍历-求表长*/
    int Length(PtrToLNode PtrL){
        PtrToLNode p = PtrL;    /*p指向表第一个节点*/
        int j = 0;
        while(p){
            p = p->Next;
            j++;    /*此时p指向第j个节点*/
        }
        return j;
    }
    
    
    
    
    
    /* 按序查找 */
    /* 查找第K个数,并返回其值的指针 */
    PtrToLNode FindKth( int K, PtrToLNode PtrL )
    {   PtrToLNode p = PtrL;    /*p指向表第一个节点*/
        int i = 1;
        while( p != NULL && i < K ){
            p = p->Next;
            i++;
        }
        if ( i == K )  return p;    /* 如果找到,返回指针 */
        else  return NULL;
    }
    /* 按值查找 */
    /* 查找X,并返回其值位置 */
    int Find( int X, PtrToLNode PtrL )
    {   PtrToLNode p = PtrL;    /*p指向表第一个节点*/
        int j = 1;
        while( p != NULL && p->Data != X ){
            p = p->Next;
            j++;
        }
        return j;
    }
    
    
    /* 插入 */
    /* 必须知道前一个节点才能插入 */
    PtrToLNode Insert( PtrToLNode PtrL, ElementType X, int i )
    {
        PtrToLNode p,s;
        if(i == 1){ //第一个节点特殊处理
            s = (PtrToLNode)malloc(sizeof(struct LNode));
            s->Data = X;
            s->Next = PtrL;
            return s;
        }
        p = FindKth(i-1,PtrL);
        if(p == NULL){
            printf("参数i错误");
            return NULL;
        }
        else{
            s = (PtrToLNode)malloc(sizeof(struct LNode));
            s->Data = X;
            s->Next = p->Next;
            p->Next = s;
            return PtrL;
        }
    }
    
    /* 删除 */
    /* 必须知道前一个节点才能删除 */
    PtrToLNode Delete( PtrToLNode PtrL, int i){
        PtrToLNode p,s;
        if(i == 1){  //第一个节点特殊处理
            s = PtrL;
            if(PtrL != NULL) PtrL = PtrL->Next; //链跳过第一个节点
            else return NULL;
            free(s);
            return PtrL;
        }
        p = FindKth(i-1,PtrL);
        if(p == NULL){
            printf("第 %d 个结点不存在",i-1); return NULL;
        }
        else if(p->Next == NULL){
            printf("第 %d 个结点不存在",i-1); return NULL;
        }
        else{
            s = p->Next;
            p->Next = s->Next;  //跳过s
            free(s);
            return PtrL;
        }
    }
    
    void DestoryList( PtrToLNode PtrL )
    {
            PtrToLNode p;
    
            if(PtrL == NULL)
                    return;
    
            while(PtrL)
            {
                    p = PtrL;
                    PtrL=PtrL->Next;
                    free(p);
            }
    }
    
    
    
    int main()
    {
        int i,l,n,x,K,j,X;
        int m,M,d;
        PtrToLNode PtrL,find1,find2;
        scanf("%d",&n);
        for(i = 0; i < n; i++){
            scanf("%d",&x);
            PtrL = CreatNewList(PtrL , x);
        }
        l = Length(PtrL);
        printf("Length = %d \n",l);
        ShowNewList(PtrL);
    
        printf("Find Kth number, input K :");
        scanf("%d",&K);
        find1 = FindKth( K,  PtrL );
        printf("Kth = %d\n",find1->Data);
    
        printf("Find a number, input number :");
        scanf("%d",&X);
        j = Find( X, PtrL );
        printf("%d is in the %d th position\n", X,j);
    
        printf("insert m in M ,input m M :");
        scanf("%d %d",&m,&M);
        PtrL = Insert( PtrL,  m,  M );
        ShowNewList(PtrL);
    
        printf("delete d th number, input d :");
        scanf("%d",&d);
        PtrL = Delete( PtrL, d);
        ShowNewList(PtrL);
    
        DestoryList(PtrL);
    
    
    
        return 0;
    }
    
    

    相关文章

      网友评论

        本文标题:线性表之单链表

        本文链接:https://www.haomeiwen.com/subject/mtihextx.html