带头结点的链表---C语言

1、链表分为带头结点、不带头结点两种;

2、头结点的数据域不存放数据;

3、链表增加头结点的原因:使往第一个位置插入和删除元素的操作和其他位置一样;

4、常见的会考到:

                    ①手写链表、

                    ②实现链表的创建(插入、删除、摧毁、逆序等)操作、

                    ③链表模拟栈、

                    ④链表模拟队列、

                    ⑤判断链表是否成环、

                    ⑥判断两个链表是否交叉

 

带头结点的代码:

/*********************************************************************************
 *      Copyright:  (C) 2018 Yujie
 *                  All rights reserved.
 *
 *       Filename:  linker.c
 *    Description:  有头结点的链表
 *                 
 *        Version:  1.0.0(08/23/2018)
 *         Author:  yanhuan <yanhuanmini@foxmail.com>
 *      ChangeLog:  1, Release initial version on "08/23/2018 08:14:27 AM"
 *                 
 ********************************************************************************/

#include <stdio.h>
#include <string.h>
#include <malloc.h>


typedef  struct  node
{
    int          data;
    struct node *next;
}NODE_t,*NODE_p;


NODE_p   create_linker(void)
{
    NODE_p   s = (NODE_p)malloc(sizeof(NODE_p));
    s->data = 0x00;
    s->next = NULL;

    return s;
}


NODE_p   create_linker_Tail(NODE_p  Np)      //传入头指针
{
    int         length,n = 1;
    NODE_p      Np_now = Np;            //当前位置指针

    printf("Please input the length of linker you want to creat : \n");
    scanf("%d",&length);

    while(n <= length)
    {
        NODE_p   s = (NODE_p)malloc(sizeof(NODE_t));
        printf("Please input the %d num : ",n);
        scanf("%d",&s->data);

        s->next = NULL;
        Np_now->next = s;
        Np_now = s;
        n++;
    }

    printf("Input finished \n\n");

    return  Np;
}


NODE_p   create_linker_Head(NODE_p  Np) 
{
    int         length;

    printf("Please input the length of linker you want to creat : \n");
    scanf("%d",&length);

    while(length)
    {
        NODE_p   s = (NODE_p)malloc(sizeof(NODE_t));
        printf("Please input the NO.%d data : ",length);
        scanf("%d",&s->data);

        s->next  = Np->next;
        Np->next = s;
        length--;
    }

    printf("Input finished \n\n");

    return  Np;
}

NODE_p    insert_Node(NODE_p  Np,int  data,int  pos)
{
    int     i = 1;
    NODE_p  Np_now = Np->next;

    while(Np_now != NULL)
    {
        if(i == pos)
        {
            NODE_p   s = (NODE_p)malloc(sizeof(NODE_t));
            s->data = data;
            s->next = Np->next;
            Np->next = s;
            printf("Insert No.%d data is %d success\n",i,s->data);
            return  Np;
        }
        else
        {
            Np_now = Np_now->next;
            i++;
        }
    }

    printf("Insert error : Cannot find this position %d \n\n",pos);

    return  Np;
}

NODE_p    delete_Node(NODE_p  Np,int  pos)
{
    int    i = 1;
    NODE_p  Np_now = Np->next;
    NODE_p  p;

    while(Np_now->next != NULL)
    {
        if(i == pos-1)
        {
            p = Np_now->next;
            Np_now->next = Np_now->next->next;
            printf("Delete No.%d data is %d success\n",i,p->data);
            free(p);
            return  Np;
        }
        else
        {
            Np_now = Np_now->next;
            i++;
        }
    }

    printf("Delete error : Cannot find this position %d \n\n",pos);

    return  Np;

}

void      destory_linker(NODE_p  Np)
{
    NODE_p    Np_now;

    while(Np->next != NULL)
    {
        Np_now = Np;
        Np = Np->next;
        Np_now->next = NULL;
        free(Np_now);
    }

    printf("Destory linker finished \n\n");

}


void      travel(NODE_p  Np)
{
    NODE_p      Np_now = Np->next;     //当前位置指针
    int         n = 1;

    while(Np_now != NULL)
    {
        printf("The NO.%d data of linker is %d\n",n,Np_now->data);
        n++;
        Np_now = Np_now->next;
    }

    printf("Travel finished\n\n");
}



int main (int argc, char **argv)
{

    NODE_p        Np = create_linker();     //头指针,分配头结点

    create_linker_Head(Np);

    travel(Np);

    insert_Node(Np,3,1);

    travel(Np);

    delete_Node(Np,2);

    travel(Np);

    destory_linker(Np);

    travel(Np);

    return 0;
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值