YJX_Driver_035_在认识链表结构exe部分

1、

在认识链表结构exe部分
  A、链表结构
  B、链表的初始化
  C、在链表中插入数据(结点)
  D、链表的遍历

 

【100】

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

  【210】链表 的图形 讲解

    【223】它一般有一个头结点,一般是最前面的这个,头结点 一般是不包含数据域Data的,一般头结点只有两个指针

    【330】R ==> Right,L ==> Left

  【565】看一下,一个空节点的形式。空节点 一般来说 什么都没有,它只有两个指针,但是它里面没有指向任何的值,当然有可能它有一个数据域

    ZC: 空节点 会有 数据域?上面讲的 头结点 都没有数据域啊...

  【660】链表初始化。

    【690】把 R&L 两个指针域 都指向 它自己(head->Flink = head->Blink = head;)

    【710】也就是 我们 在编程的时候,初始化链表 可以用这种方式:
      head->L=head->R=head;

  【900】在链表中插入个元素

PDATALINK pnode=new DATALINK; // 新插入的节点
PDATALINK pt;  // 【1835】临时的指针
for (int i=1;i<=5;i++)
{
  pnode->data=i;
  pt=head->R;

// 4个指针
  pnode->R=pt;
  pnode->L=head;
  head->R=pnode;
  pt->L =pnode;
}

  【2180】这种插入 称为 头部插入

【2430】遍历 链表

//遍历链表数据,并显示
pt=head;
do
{
  printf("pt->data=%x\n",pt->data);
  pt=pt->R;
} while(pt!=head); // while(!(pt==head));

  ZC: 在【223】说,头节点 一般不包含 数据域Data,貌似 都有 数据域Data... 等于没说...

  ZC: 这里 头节点的data 也会被打印出来,合适么?

 

【3360】

  直接用 第34课 的exe程序来测试一下。

  ZC: 是用exe程序来做的测试...我记得 貌似书上写的和这里不太一样...

  【3450】新建 头文件Linktype.h

 

ZC: 本节课,将的 链表所使用的结构 是自己定义的,总感觉怪怪的(应该是觉得R和L怪)... 初始化链表 也感觉怪怪的...见【5735】处。

 

【4750】用OD来看一下

  【5105】OD 中 dd命令

  【5130】刚刚和现在都一直看不到想看的内容(ZC: 我自己测试看看)

  【5180】这次看到了(ZC: 但是感觉数据不对。结构体的高位低位对应的不对),可能是由于模块的原因(ZC: 个人感觉也就是OD的领空选择的不对)

  【5192】再看一个"dd 3a0f60"(ZC: 感觉数据还是不对。结构体的高位低位对应的不对)

    ZC: 对的对的,他在代码里面 和在讲解的时候又不一样了,他代码里面 L写在上面,R写在下面... ...

    这个是 头结点,它的数据域 是 0(ZC: 还是和【223】矛盾啊...)

  【5275】OD数据窗口 -->右击-->数据窗口中跟随,【5288】再一次“OD数据窗口 -->右击-->数据窗口中跟随”,【5315】再次“OD数据窗口 -->右击-->数据窗口中跟随”,这块区域 我们可以看到 它好像是连续的,当然它可能不会??。

    ZC: 相邻结构体的地址的差为0x18(6个sizeof(int),sizeof(DATA_LINK)为4个sizeof(int))(包括 头结点在内),这是某种巧合么?更倾向于是编译器的有意为之,但不知道其中原理... 自己也可以测试看看是否也是这个现象。

 

【5735】下节课会提及,驱动里面 专用的链表初始化的一些函数 或者是称它为宏 ∵那些函数大都是??一些宏组成的。

 

2、

认识链表结构
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));
}

 

转载于:https://www.cnblogs.com/debugskill/p/5374292.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值