C语言链表基本操作

来源:互联网 发布:java lucene 内容搜索 编辑:程序博客网 时间:2024/05/20 09:08

//链表节点定义

struct LinkNode {
        int val;
        struct LinkNode *next;

};

//创建长度为listLen的链表,每个节点的值为0~listLen-1

LinkNode * createLink(int listLen){

        struct LinkNode *phead,*ptail;
        phead=ptail=(struct LinkNode *)malloc(sizeof(LinkNode));
        phead->next=NULL;


        for(int i=0;i<listLen;i++){
                struct LinkNode *nn = (struct LinkNode *)malloc(sizeof(LinkNode));
                nn->val = i;
                nn->next = NULL;
                ptail->next=nn;
                ptail=nn;
        }
       return phead->next;

}

//链表中值为val的节点后插入一个新的节点

LinkNode * insertNode(LinkNode *ph, int val){
        if(ph==NULL || ph->next==NULL)
                return NULL;


        LinkNode *ln=ph->next;
        while(ln!=NULL && ln->val!=val){
                ln = ln->next;
        }
        if(ln!=NULL){
                LinkNode *nn = (LinkNode *)malloc(sizeof(LinkNode));
                nn->val=val;
                nn->next=ln->next;
                ln->next=nn;
        }
        return ph;

}


//删除链表中值为val的节点

//delete a node 
LinkNode * delNode(LinkNode *ph, int val){

        if(ph==NULL || ph->next==NULL)
                return NULL;
        LinkNode *ln=ph->next;
        LinkNode *lp=ph;
        while(ln!=NULL && ln->val!=val){
                lp = ln;
                ln = ln->next;
        }
        if(ln!=NULL){
                LinkNode *tp = lp->next;
                lp->next=lp->next->next;
                free(tp);
        }
        return ph;

}

//正序打印链表

void printLinkList(LinkNode *ph){
        while(ph!=NULL){
                printf(" %d addr=%p\n ", ph->val,  ph->next);
                ph=ph->next;
        }

}

//逆序打印链表

void printLinkListReverse(LinkNode *ph){
        if(ph !=NULL ){
                if(ph->next != NULL){
                        printLinkListReverse(ph->next);
                }
                printf("%d\n",ph->val);
        }
}




原创粉丝点击