普通链表
只能一个方向遍历,是因为结构体中只含有链表的下一个的指针,从该结点只能找到下一个结点,而不能找到上一个结点,具有一定的局限性
双向链表
故名思意就是可以两个方向进行遍历的链表。每个结点中都包含上一个结点的地址和下一个结点的地址,既可以从前向后也可以从后向前,可以双向遍历
#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{
int nVal;
struct Node* pNext;
struct Node* pLast;
}List;
双向链表的添加需要同时考虑头节点和尾结点,(采用二级指针,才可对内容进行可保留编辑)
void AddNode(List** ppHead, List** ppEnd, int nVal)
{
List* pTemp = malloc(sizeof(List));
pTemp->nVal = nVal;
pTemp->pNext = NULL;
pTemp->pLast = NULL;
if (*ppHead == NULL)
{
*ppHead = pTemp;
}
else
{
(*ppEnd)->pNext = pTemp;
pTemp->pLast = *ppEnd;
}
*ppEnd = pTemp;
}
通过主函数对双向链表添加功能进行测试
int main()
{
List* pHead = NULL;
List* pEnd = NULL;
AddNode(&pHead, &pEnd, 1);
AddNode(&pHead, &pEnd, 2);
AddNode(&pHead, &pEnd, 3);
AddNode(&pHead, &pEnd, 4);
return 0;
}
测试结果,可以从头找到尾,也可以从尾找到头