双向链表
== >博主:墙角黑猫
< 1 > 原理解释:
双向链表的理解是在每个节点之间存在双向的连接,例如和单链表对比:单链表是 A -> B -> C -> D ->...
每个节点是单向连接的,A只能指向B,从B无法直接到A。而双向链表是 A <==> B <==> C <==> D <==>....
这样就实现了A和B的完全互通。大家可以结合下图理解一下!!
< 2 > 代码部分:
#include <stdio.h>
#include <stdlib.h>
#define OK 1;
#define ERROR 0;
typedef char ElemType;
typedef int Status;
typedef struct DualNode
{
ElemType data;
struct DualNode *prior;
struct DualNode *next;
}DualNode;
typedef struct DualNode* DuLinkList;
Status InitList(DuLinkList *L)
{
DualNode *p,*q;
int i;
(*L) = (DuLinkList)malloc(sizeof(DualNode));
if(!(*L))
{
return ERROR;
}
(*L) ->next = (*L)->prior = NULL;
p = (*L);
for(i=0; i<26; i++)
{
q = (DualNode *)malloc(sizeof(DualNode));
if(!(q))
{
return ERROR;
}
q -> data = 'A' + i;
q -> prior = p;
q -> next = p -> next;
p -> next = q;
p = q;
}
p -> next =(*L) -> next;
(*L) -> next -> prior = p;
return OK;
}
void Caesar(DuLinkList *L, int i)
{
if(i > 0)
{
do
{
(*L) = (*L)->next;
}while (--i);
}
if(i < 0)
{
do
{
(*L) = (*L)->prior;
}while (++i);
}
}
int main()
{
DuLinkList L;
int i, n;
InitList(&L);
printf("小姐姐,请输入一个整数!!\n");
scanf("%d", &n);
Caesar(&L, n);
for(i=0; i < 26; i++)
{
L = L -> next;
printf("%c\t", L -> data);
}
printf("\n");
return 0;
}
< 3 > 说明一下:
上面的代码是把图片中的prev换成了prior,其次上面的初始化函数(InitList())是作了两件事一件是申请地址第二件是构建连接相当于初始化和添加节点放到了一起,有的人话把他们分开来。第二个函数(Caesar())作了一件简单事,就不在这里说明了,大家可以根据代码自己理解!
每个人的实现代码可能千差万别,但是重要的还是能够自己理解并且构建出来,至于什么样性能好不好是初步掌握以后的是!最后的最后还是那句话,欢迎大家给出宝贵的意见。