转自:https://blog.csdn.net/ljf_djcrs/article/details/79301502
找到的还不错的双向链表代码,包含了基本函数的实现
这几天做了笔试题发现双向链表这一块自己掌握的很差,所以写下此博客来加深自己对双向链表的理解
首先什么是双向链表?
通过翻阅资料知道双向链表是指在前驱和后继方向都能遍历的线性表
自己在软件上写了几遍,代码如下
1、双向链表的定义
typedef int ElemType;
typedef struct node{
ElemType data;
struct node *left;
struct node *right;
}DblNode;
typedef DblNode *DblList;
2、建立空的双向链表
void CreateDblList(DblList *first) //创建双向链表
{
(*first) = (DblNode *)malloc(sizeof(DblNode));
if (first == NULL)
{
return;
}
(*first)->left = (*first)->right = (*first); //初始化 表头结点的指针都指向自己
}
3、查找第 i 个结点的位置
DblNode* Locate(DblList first, int i) //查找第 i 个结点在链中的位置
{
if (i < 0)
return first;
DblNode *p = first->right;
int j = 1;
while (p != NULL && i < j)
{
p = p->right;
j++;
}
return p;
}
4、双向链表插入结点
void InsertList(DblList first,int i, ElemType data) //双向链表插入结点
{
DblNode *p = Locate(first, i-1);
if (p == first && i != 1)
return 0;
DblNode *q = (DblNode *)malloc(sizeof(DblNode));
q->data = data;
q->left = p;
q->right = p->right;
p->right = q;
p->right->left = q;
}
5、双向链表删除结点
void Remove(DblList first, int i) //双向链表删除结点
{
DblNode *p = Locate(first, i);
if (p == first)
return 0;
p->right->left = p->left;
p->left->right = p->right;
free(p);
}