双向链表:结点中有两个指针域,分别指向其直接前驱元素和直接后继元素。
双向链表结点的C语言描述:
typedef struct DuLNode{
ElemType data;
struct DuLNode *prior;
struct DuLNode *next;
}DuLNode, *DuLinkList;
双向链表的实现(包括创建、插入、删除等)如下:
#include
#include
#ifndef FALSE
#define FALSE (0)
#define TRUE (!FALSE)
#endif
typedef int ElemType;
typedef struct DuLNode{
ElemType data;
struct DuLNode *prior;
struct DuLNode *next;
}DuLNode, *DuLinkList;
DuLinkList ListDelete(DuLinkList L, int n)
{
int i = 0;
DuLinkList tmp;
tmp = L;
while(1){
if(tmp->next == L)
return FALSE;
if(i++ == n){
tmp->prior->next = tmp->next;
tmp->next->prior = tmp->prior;
return L;
}
tmp = tmp->next;
}
}
DuLinkList ListInsert(DuLinkList L, int n, ElemType e)
{
int i = 0;
DuLinkList tmp, p;
p = (DuLinkList)malloc(sizeof(DuLNode));
if(p == NULL){
printf("create link node failure.\n");
return FALSE;
}
p->data = e;
tmp = L;
while(1){
if(tmp->next == L)
return FALSE;
if(i++ == n){
p->next = tmp->next;
p->prior = tmp;
tmp->next->prior = p;
tmp->next = p;
return L;
}
tmp = tmp->next;
}
}
//create double list node
DuLinkList CreateList(DuLinkList L, int n)
{
int i;
DuLinkList p;
for(i = 0; i < n; i++){
p = (DuLinkList)malloc(sizeof(DuLNode));
if(p == NULL){
printf("can't alloc double link node.\n");
free(L);
exit(0);
}
scanf("%d", &p->data);
p->prior = L;
p->next = L->next;
L->next->next->prior = p;
L->next = p;
}
return L;
}
void TraverseList(DuLinkList L)
{
DuLinkList p = L;
printf("the list element is :\n");
while(p->next != L){
printf("%d ", p->next->data);
p = p->next;
}
putc('\n', stdout);
return;
}
int
main(void)
{
int length;
//create the head node of double link list
DuLinkList L;
L = (DuLinkList)malloc(sizeof(DuLNode));
if(L == NULL){
printf("can't create double link list.\n");
exit(0);
}
L->next = L;
L->prior = L;
printf("the length of double link list you want to create:");
scanf("%d", &length);
L = CreateList(L, length);
TraverseList(L);
L = ListInsert(L, 3, 0);
TraverseList(L);
L = ListDelete(L, 3);
TraverseList(L);
exit(0);
}