老师 发表于 2016-2-7 15:10:59

动态链表的插入问题???大家棒棒梦,拜谢了

大家好!首先祝大家新年快乐,万事如意!
像我这样没有回家过年的单身汪,只能在房间里默默的研究代码了。。。。
首先来看看代码

#include <stdio.h>

struct DATA
{
        int num;
        struct DATA *p;
}data,*sp=&data;

int main()
{
        int a=11,b;
        sp->p=sp;
        sp->num=10;
       
        printf("&data=%d\n",&data);
        printf("sp=%d\n",sp);
        printf("&sp->num=%d\n",&sp->num);
        printf("sp->p=%d\n",sp->p);
        printf("sp->num=%d\n",sp->num);
        printf("*sp->p=%d\n",*sp->p);
        b=*sp->p;/*这里的意思是结构体中的指针p所指向的数值复制给变量b*/
        if(a>b)
                printf("a>*sp->p\n");
        else
                printf("a<*sp->p\n");
        return 0;
}
如果用红色字体的那样做是行不通的,原因为类型不兼容,从逻辑上讲*p指向的同样是一个整型的数,为什么会不兼容呢?(我猜想可能因为p是结构指指针的原因,这是第一个问题)



上面的方法行不通,那么我们在换一种方法试试看,代码如下:
#include <stdio.h>

struct DATA
{
        int num;
        struct DATA *p;
}data,*sp=&data;

int main()
{
        int a=11;
        sp->p=sp;
        sp->num=10;
       
        printf("&data=%d\n",&data);
        printf("sp=%d\n",sp);
        printf("&sp->num=%d\n",&sp->num);
        printf("sp->p=%d\n",sp->p);
        printf("sp->num=%d\n",sp->num);
        printf("*sp->p=%d\n",*sp->p);
        if(a>*sp->p)
                printf("a>*sp->p\n");
        else
                printf("a<*sp->p\n");
        return 0;
}
代码中红色字体部分,这样也是错误的,原因是'>' : illegal for struct。为什么会提示说‘>’要指向结构呢?(这是第二个问题)。


当然看到这里肯定有人会纳闷,我为什么要用这样的方法呢,
原因是这样的,如果有一个链表B>B>C>E,我想在中间插入D,那么就需要判断D的位置,所以当指针到达C时只能通过这种方式找到E然后比较D是否在C和E之间,不过还用一种方法,就是多定义一个结构指针来指向E。这里我想知道如果我就是要用第一种方法,有什么解决办法么?

n0noper 发表于 2016-3-3 10:09:06

// VC++6.0 Debug模式下 反汇编结果:
21:            printf("*sp->p=%d\n",*sp->p);
004010AF   mov         eax,
004010B4   mov         ecx,dword ptr
004010B7   mov         edx,dword ptr
004010BA   push      edx
004010BB   mov         eax,dword ptr
004010BD   push      eax
004010BE   push      offset string "*sp->p=%d\n" (00422034)
004010C3   call      printf (00401140)
004010C8   add         esp,0Ch

上述已经很明显了吧?如果没看过汇编,看下边。
还有,指正一点:*p并非指向一个整型的数,而是一个struct DATA.
解释:*sp->p   '->'比'*'优先级高,所以先(sp->p)获得一个struct DATA*类型,然后'*'操作取得的结果是一个struct DATA结构体类型,并非主观以为的整型。
// 下边那种情况相同,我也就不多说了

老师 发表于 2016-3-3 21:03:55

n0noper 发表于 2016-3-3 10:09


谢谢,说的很详细了,(*sp->p->num)。受教了,非常感谢。
页: [1]
查看完整版本: 动态链表的插入问题???大家棒棒梦,拜谢了