双向链表的定义
//双向链表的定义
typedef struct DualNode
{
ElemType Data; //数据域
struct DualNode* prior; //前驱结点
struct DualNode* next; //后继结点
}DualNode,*DuLinkList;
双向链表结点的插入
s -> prior = p; //把p赋值给s的前驱,如图①
s -> next = p+1; //把p->next赋值给s的后继,如图中的②
p -> next ->prior = s; //将s赋值给p -> next 的前驱
p -> next = s; //将s赋值给p的后继,如图④
顺序是先搞定s的前驱和后继,再搞定后结点的前驱,最后解决前结点的后继。
双向链表结点的删除
p -> prior -> next = p -> next; //将p -> next 赋值给p -> prior 的后继,如图①
p -> next ->prior = p -> prior; //将p -> prior 赋值给 p ->next 的前驱,如图②
free(p); //释放结点
代码实例:
#include <stdio.h>
#include <malloc.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,*DuLinkList;
//双向链表的初始化
Status InitList(DuLinkList* L) //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和q均为尾结点
p->next = (*L)->next;
(*L)->next->prior = p;
return OK;
}
void Caesar(DuLinkList* L, int i)
{
//使用do...while的目的,先将头结点更新为第一个元素所在的结点
if (i > 0)
{
do
{
(*L) = (*L)->next;
} while (--i);
}
if (i < 0)
{
do
{
(*L) = (*L)->next;
} while (++i);
//(*L) = (*L)->next;
//while (++i)
//{
// (*L) = (*L)->prior;
//}
}
}
int main()
{
DuLinkList L;
int i, n;
InitList(&L);
printf("请输入一个整数:");
scanf("%d", &n);
Caesar(&L, n);
printf("\n");
for (i = 0; i < 26; i++)
{
L = L->next;
printf("%c", L->data);
}
return 0;
}