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));
}