循环链表创建并排序输出

问题遇到的现象和发生背景

输入n个整数,创建一个双向循还链表表进行存储,这些整数从第二个结点至表尾递增有序(设a1【样例输入】5 3 1 2 4 5
【样例输出】1 2 3 4 5
【样例说明】输入数据的第一个数是整数的个数,其后是数据

用代码块功能插入代码,请勿粘贴截图
#include
#include

typedef struct dnode
{
    int data;
    struct dnode* back, * next;
}dnode, * doublelist;

void initlist(doublelist *l)
{
    *l = (doublelist)malloc(sizeof(dnode));
    (*l)->next = (*l)->back = *l;
}

int dlinkins(doublelist l, int i, int e)
{
    dnode* s, * p;
    int k; 
    if (i <= 0) return 0;
    p = l; k = 0;
    while (p != NULL && k < i - 1)
    {
        p = p->next;
        k = k + 1;
    }
    if (p == NULL)
    {
        printf("插入位置不合理");
        return 0;
    }
    
    s = (dnode*)malloc(sizeof(dnode));
    if (s)
    {
        s->data = e;
        s->back = p->back;
        p->back->next = s;
        s->next = p;
        p->back = s;
        return 1;
    }
    else return 0;
}

void sortlist(doublelist l)
{
    dnode* p, * q, * r;
    p = l->next; q = p->next; r = q->next;
    while (q != l)
    {
        while ((p != l) && (p->data > q->data))
            p = p->back;
        q->back->next = r; r->back = q->back;
        q->next = p->next; q->back = p;
        p->next->back = q; p->next = q;
        q = r; p = q->back;
        r = r->next;
    }
}

void shownode(doublelist l)
{
    doublelist temp = l;
    while (l->next != temp)
    {
        printf("%d", l->data);
        l = l->next;
    }
    printf("%d", l->data);
}

int main()
{
    int m = 0; int i;
    
    doublelist *l;
    initlist(&l);
    scanf_s("%d", &m);
    for (i = 0; i < m; i++)
    {
        int j = 0;
        scanf_s("%d", &j);
        dlinkins(l, 1, j);
    }
    sortlist(l);
    shownode(l);
    return 0;
}




运行结果及报错内容

img

首先第一个问题,你这编译器不报错吗
1级指针地址穿过去要2级指针接收才可以