鱼C论坛

 找回密码
 立即注册
查看: 1899|回复: 2

[已解决]动态链表的插入问题???大家棒棒梦,拜谢了

[复制链接]
发表于 2016-2-7 15:10:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

#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。这里我想知道如果我就是要用第一种方法,有什么解决办法么?
最佳答案
2016-3-3 10:09:06
// VC++6.0 Debug模式下 反汇编结果:
21:            printf("*sp->p=%d\n",*sp->p);
004010AF   mov         eax,[sp (00424a30)]
004010B4   mov         ecx,dword ptr [eax+4]
004010B7   mov         edx,dword ptr [ecx+4]
004010BA   push        edx
004010BB   mov         eax,dword ptr [ecx]
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结构体类型,并非主观以为的整型。
// 下边那种情况相同,我也就不多说了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-3-3 10:09:06 | 显示全部楼层    本楼为最佳答案   
// VC++6.0 Debug模式下 反汇编结果:
21:            printf("*sp->p=%d\n",*sp->p);
004010AF   mov         eax,[sp (00424a30)]
004010B4   mov         ecx,dword ptr [eax+4]
004010B7   mov         edx,dword ptr [ecx+4]
004010BA   push        edx
004010BB   mov         eax,dword ptr [ecx]
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结构体类型,并非主观以为的整型。
// 下边那种情况相同,我也就不多说了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-3 21:03:55 | 显示全部楼层

谢谢,说的很详细了,(*sp->p->num)。受教了,非常感谢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-26 20:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表