免費論壇 繁體 | 簡體
Sclub交友聊天~加入聊天室當版主
分享
返回列表 发帖

在认识链表结构exe部分

A、链表结构
B、链表的初始化
C、在链表中插入数据(结点)
D、链表的遍历
课时:30

链表:
  链表有单向链表,也有双向链表,有循环的(环形),在这里我们只讨论 双向循环链表。
双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。


认识链表结构
typedef struct node
{
  struct node R;
  struct node L;
  int data;
}*PDATALINK,DATALINK;
PDATALINK head=new DATALINK;

//初始化链表
  head->L=head->R=head;
//在链表中插入个元素
PDATALINK pnode=new DATALINK;
PDATALINK pt;
for (int i=1;i<=5;i++)
{
pnode->data=i;
pt=head->R;
pnode->R=pt;
pnode->L=head;
head->R=pnode;
pt->L =pnode;
}
//遍历链表数据,并显示
pt=head;
do
{
   printf("pt->data=%x\n",pt->data);
   pt=pt->R;
} while(pt!=head) // while(!(pt==head))


//文件名:Linktype.h
typedef struct _DATA_LINK
{
/*链域,*llink是左链域指针,*rlink是右链域指针*/
struct _DATA_LINK *L;
struct _DATA_LINK *R;
// struct _DATA_LINK *Head;
int data; /*数据域*/
int data2;
}DATA_LINK,*PDATA_LINK;

//LIST_ENTRY My_List; //自定义链接头


PDATA_LINK head=new DATA_LINK;
VOID Link_Test()
{
       
        //初始化链表
         head->L=head->R=head;
         head->data=0;
         head->data2=0;
    printf("head=%x\n",head);
        PDATA_LINK Tlink;
        ULONG i = 0;
        //在链表中插入5个元素
        printf(("开始构建链表 \n"));
        for (i=1 ; i<=5 ; i++)
        {
           PDATA_LINK        pData =new DATA_LINK;  
           pData->data = i;
           pData->data2= i+1;
           //
           Tlink=head->R;//保存后续结点
           Tlink->L=pData;
           head->R=pData;
           //
           pData->R=Tlink;
           pData->L=head;

         //  printf("Node%d=%x,R=%x,L=%x,%d,%d\n",
          //        pData->data-7,pData,pData->R,pData->L,pData->data,pData->data2);         
        }

        //从链表中取出,并显示
        printf("head=%x\n",head);
         
    PDATA_LINK pnode=head;
           do   //判断 遍历完成否
        {
       
                //显示链表内存结构
                printf("结点%d=%x,R=%x,L=%x,%d,%d\n",
                pnode->data,pnode,pnode->R,pnode->L,pnode->data,pnode->data2);
                pnode=pnode->R;
        } while (!(pnode==head));
       
}

========================

笔记:
老师为了讲清内容还画了几张FLASH图,真是很认真啊!


比如Date是头节点,一般不包括数据域,上图就是6个节点的链表,每个节点都有两个指针,R节点都是指向右边,R结点都是指向左边。比如一个空节点只有两个指针和一个数据域,初始化的时候将R和L都指向自己。
  head->L=head->R=head;
然后新插入的节点就变成互相指向,再插入就会紧挨在头节点旁边,然后就形成循环指向的指针,叫pnode。然后编写代码,创建一个结构,再创建一个循环进行赋值,这样就插入一个节点。(代码在教案中)

而我们要遍历整个节点的时候,先是找到节点头部,然后向访问,因为第一次访问就是初始节点,所以用DO WHILE语句,这样执行一次之后再判断是否初始节点。
(代码在教案中)

代码写好后新建一个linktype.h文件,将代码写入进行测试,在修改了几处错误之后就输出了构建节点的链表和6处节点
  head->L=head->R=head;


head=381b40
开始构建链表
head=381b40
结点0=381b40,R=3807b8,L=380758,0,0
结点1=380758,R=381b40,L=380770,1,2
结点2=380770,R=380758,L=380788,2,3
结点3=380788,R=380770,L=3807a0,3,4
结点4=3807a0,R=380788,L=3807b8,4,5
结点5=3807b8,R=3807a0,L=381b40,5,6

通过上面输出,我们看到所有的R都是指向前一个节点,所有的L都指向下一个节点,最后循环指向。然后在OD里加载一下这个EXE看一下,没发现有用信息。再把变量定义成全局的OD一下,
003a0fc0        003a0fd8
003a0fc4        003a0fa8

然后再往里看信息,一层一层的都有互相的指向,这种链表很有意思。

随记:哦,这个东西就是所谓的双向链表啊,可是这东西有什么用呢?难道说有的游戏是用这种结构吗?

返回列表