关于c的双向链表中的问题求解答

typedef struct sum {
int num;
int length;
struct sum * pnext; 下个节点
struct sun * pbefore; 上个节点
} number;

我在添加函数中
n1 = (number *)malloc(sizeof(number) );
printf("请输入数字.\n");

scanf_s("%d",&( n1->num));

printf("请输入标记数字。\n");
scanf_s("%d",&n1->length);
n1->pnext = n1;         //这里正确通过了
n1->pbefore = n1;    //这里提示 不能将 number *类型的值 分配到  sum* 类型的实体中

我就奇怪了  俩个一模一样的语句  ,上边的没事 下边提示有这个错误。请高手帮看一下 这是什么原因啊

这个是我的整体代码 如下:
number * n;
n = p->pheads;
number * n1;
n1 = (number *)malloc(sizeof(number) );
printf("请输入数字.\n");

scanf_s("%d",&( n1->num));

printf("请输入标记数字。\n");
scanf_s("%d",&n1->length);
n1->pnext = n1;                                 //这个却没有提示  。请问是什么原因啊
n1->pbefore = n1;                            //这里提示错误,不能将 number * 类型的值 分配 到sum*类型的实体 
if (!empty(*p))
{
    p->pheads = n1;
    printf("ok\n");
}
else
{
    while (p->pheads->pnext != NULL)                         //循环寻找到最后的空指针
    {
        p->pheads->pnext = p->pheads->pnext->pnext;
    }

    n1->pbefore = p->pheads;         //这里也提示那样的错误 ,显示 不能将sum* 类型的值 分配到 sum* 类型的实体
    p->pheads->pnext = n1;
    p->pheads = n;
}

// p->pheads = n; //重新定位头指针

}
这个是我的添加函数中的代码。

结构体如下:typedef struct sum {
int num;
int length;
struct sum * pnext;
struct sun * pbefore;
} number;
这个是结构体

typedef struct phead {
number * pheads;
}ph;
求高手解答一下。3q了

我的思路是直接一个循环直接赋值。但是在赋值前一个的指针时就有这种提示 :不能将 sum * 类型的值 分配到 sum* 类型的实体 。
我不能理解 按照道理来讲 。

       通过循环和判断得到当前   p->phead 
                                             p->phead->pnext 为下个结构体

                                                                        n1->pbefore = p->phead;    //这里是对 添加的数据n1的前指针进行赋值的  没错啊   但是提示这里有错误。
                                                                        p->phead->pnext  = n1;   这里是没有错的。

就是提示sum* 类型的值不能分配到sum* 类型的实体 。

求解答 。以前写的时候都没有这个提示的 只是想改下程序 换个方法 就这样了

开始程序都是能正确运行的,主要是 后来在添加删除功能时 。就想到直接在结构中加个前指针 那样方面 。但是当
开始对前指针赋值时出现了这个问题。前面的程序没有问题的 主要在这个前指针赋值上。求解答一下。

这是一条编译错误提示。
代表在代码中,把一个int**类型的值,赋值给了int类型的变量。
类似于
int v;
int *p = &v;
然后做了
v = &p;
这样的操作。

类似操作,大多数是误写,本来要写
p=&v;
但是写成了
v=&p;
针对修改即可。

如果确定要把int**值赋值给int,可以采用
v=(int)&p;
的方式。
不过需要注意的是,在16位和32位系统中,可以完整保存地址值,但是在64位系统中,int**占8字节,而int占4字节,该操作会导致信息丢失。

n1->pbefore = p->phead; //这里是对 添加的数据n1的前指针进行赋值的 没错啊 但是提示这里有错误。
这里需要这么写 n1->pbefore = p->phead->pbefore; 两种不同类似不能赋值;