头插法建立单链表

头插法建立单链表图示过程(其中an表示时间上第n个建立的节点,L为头指针,箭头表指向,sn代表an的地址)

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAc2lsZW5jZTI4MQ==,size_20,color_FFFFFF,t_70,g_se,x_16

结构体代码与主函数如下:

struct Link //创建一个结构体类型
{
    int data;  //数据域
    struct Link* p;  //指针域
};
struct Link* Creat_link(void); //建立单链表函数
void print(struct Link*);  //输出单链表函数
int main(void)
{
    struct Link * L;

    L = Creat_link();
    print(L);
    return 0;
}

单链表建立函数如下:

struct Link* Creat_link(void)
{
    struct Link* L, * s;//L是头指针
    int i, n, size;

    size = sizeof(struct Link);
    L = (struct Link*)malloc(size);//首先建立头结点
    L->p = NULL; //将头节点指针域赋值为空同时也为尾结点指针域置空做铺垫
    scanf("%d", &n); //输入想要建立的单链表长度
    if (n == 0)
    {
        return L;
    }
    scanf("%d", &L->data);
    for (i = 1; i < n; i++)
    {
        s = (struct Link*)malloc(size);//建立新的节点
        scanf("%d", &s->data);
        s->p = L->p;//把新的节点与后面的节点接上
        L->p = s;//把新的节点与头结点接上
    }
    
    return L;
}

/* 
这两行的代码是头插法的核心:
   s->p = L->p;
   L->p = s;
   要细细品味,这两行代码如果从逻辑上看第一次执行和第n(n>=2)次执行是不一样的
   第一次执行是把新建立的节点作为尾结点并且37行使其指针域为空,第n次执行时是把
   新建立的节点插入到头结点的下一个,37行使其与后面接上,38行使其与头结点接上
   */

输出函数如下:
 

void print(struct Link* L)
{
    if (L->p == NULL)
    {
        printf("此链表为空");
    }
    else
    {
        while (1)
        {
            printf("%d ", L->data);
            if (L->p == NULL) break;
            L = L->p;
        }
        
    }
}

注:本人小白,如有错误还望指教


版权声明:本文为qq_62025266原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。