1. 尾指针:不是尾结点的指针,是指向尾结点的指针
2. 头指针:不是头结点的指针,是指向头结点的指针,无论链表是否为空,头指针均不为空。
3. 头结点:放在第一个结点之前的结点(“零结点”),数据域可以不存放东西,也可以存放链表信息(如链表长度)。
循环链表的存储结构:
typedef struct DulNode //双循环链表的存储结构
{
int data; //数据域
struct DulNode* prior; //前驱指针
struct DulNode* next; //后继指针
}DulNode, * DuLinkList;
数据结构图示:
基本操作
1. int InitDuLinkedList(DuLinkList L); //初始化*
int InitDuLinkedList(DuLinkList* L) //初始化,形参L是二级指针
{
*L = (DulNode*)malloc(sizeof(DulNode)); //头结点申请地址
if (*L == NULL)
{
printf("申请空间失败\n");
exit(0);
}
(*L)->data = -999; //随便存点数据
head = *L; //头指针指向头结点
tail = *L; //尾指针指向尾结点,目前只有一个结点,它既是头结点,也是尾结点
(*L)->prior = tail; //头结点前驱初指向尾结点
(*L)->next = (*L); //(*L)所指结点初始化时,既是头结点,也是尾结点。所以尾结点(**L)的后继指针,指向头结点
return 1;
}
2. DuLinkList CreatDuLinkList(DuLinkList L); //创建双循环链表*
DuLinkList CreatDuLinkList(DuLinkList* L) //尾插法创建双循环向链表,形参L是二级指针
{
int x; //新插入的结点值
printf("输入需要插入的元素值\n");
scanf("%d", &x);
while (x != 9999) //输入9999时结束插入
{
DuLinkList s = (DulNode*)malloc(sizeof(DulNode)); //创建新结点
if (s == NULL)
{
printf("动态申请内存失败\n");
exit(0);
}
s->data = x; //将值存入新结点
s->next = tail->next; //关键步骤
tail->next->prior = s;
tail->next = s;
s->prior = tail;
tail = s; //尾指针指向新的尾结点,
printf("插入成功\n");
printf("输入需要插入的元素值(输入9999结束插入)\n");
scanf("%d", &x);
}
return *L; //返回单链表地址
}
3. int DuLinkListInsert(DuLinkList L, int i, int e); //位置i插入元素e
int DuLinkListInsert(DuLinkList* L, int i, int e) //第i个位置