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
然后再往里看信息,一层一层的都有互相的指向,这种链表很有意思。
随记:哦,这个东西就是所谓的双向链表啊,可是这东西有什么用呢?难道说有的游戏是用这种结构吗? |