双向循环链表
双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。
DuLinkListMain.c
linklist.h
linklist.c
双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。
DuLinkListMain.c
#include
<
stdio.h
>
#include < stdlib.h >
#include " linklist.h "
/**/ /*简单测试程序*/
int main( int argc, char ** argv)
... {
ElemType elem;
LinkList pDuList;
InitList(&pDuList);
ListInsert(&pDuList, 1, 2);
printf("%d %d ", pDuList->data, pDuList->next->data);
ListDelete(&pDuList, 1, &elem);
printf("The delete element is %d ", elem);
DestroyList(&pDuList);
return 0;
}
#include < stdlib.h >
#include " linklist.h "
/**/ /*简单测试程序*/
int main( int argc, char ** argv)
... {
ElemType elem;
LinkList pDuList;
InitList(&pDuList);
ListInsert(&pDuList, 1, 2);
printf("%d %d ", pDuList->data, pDuList->next->data);
ListDelete(&pDuList, 1, &elem);
printf("The delete element is %d ", elem);
DestroyList(&pDuList);
return 0;
}
linklist.h
#ifndef _LINKLIST_H
#define _LINKLIST_H
typedef int ElemType;
typedef struct DuLinkNode ... {
ElemType data;
struct DuLinkNode *prior;
struct DuLinkNode *next;
} LNode, * LinkList;
int InitList(LinkList * head);
int DestroyList(LinkList * head);
int ListInsert(LinkList * head, int i, ElemType e);
int ListDelete(LinkList * head, int i, ElemType * e);
int ListSearch(LinkList head, ElemType e);
int GetElem(LinkList head, int i, ElemType * e);
#endif
#define _LINKLIST_H
typedef int ElemType;
typedef struct DuLinkNode ... {
ElemType data;
struct DuLinkNode *prior;
struct DuLinkNode *next;
} LNode, * LinkList;
int InitList(LinkList * head);
int DestroyList(LinkList * head);
int ListInsert(LinkList * head, int i, ElemType e);
int ListDelete(LinkList * head, int i, ElemType * e);
int ListSearch(LinkList head, ElemType e);
int GetElem(LinkList head, int i, ElemType * e);
#endif
linklist.c
#include
<
stdio.h
>
#include < stdlib.h >
#include " linklist.h "
/**/ /*产生头结点为head的空双向链表*/
int InitList(LinkList * head)
... {
*head = (LinkList)malloc(sizeof(LNode));
if(!(*head))
return 0;
(*head)->next = *head;
(*head)->prior = *head;
(*head)->data = 0; /**//*链表长度*/
return 1;
}
/**/ /*操作结果:销毁头结点为head双向链表*/
int DestroyList(LinkList * head)
... {
LinkList p, q;
p = (*head)->next;
while(p != *head)
...{
q = p->next;
free(p);
p = q;
}
free(*head);
*head = NULL;
return 1;
}
/**/ /*在头结点为head的双链线性表中第i个位置之前插入元素e,i的合法值为1≤i≤表长+1*/
int ListInsert(LinkList * head, int i, ElemType e)
... {
int j;
LinkList p, s;
j = 1;
p = (*head)->next;
while(p && j < i)
...{
p = p->next;
j++;
}
if(!(s = (LinkList)malloc(sizeof(LNode))))
return 0;
s->data = e;
s->prior = p->prior;
p->prior->next = s;
s->next = p;
p->prior = s;
return 1;
}
/**/ /*删除带头结点的双链线性表的第i个元素,i的合法值为1≤i≤表长*/
int ListDelete(LinkList * head, int i, ElemType * e)
... {
int j;
LinkList p;
j = 1;
p = (*head)->next;
while(p && j < i)
...{
p = p->next;
j++;
}
if(!p || j > i)
return 0;
*e = p->data;
p->prior->next = p->next;
p->next->prior = p->prior;
free(p);
return 1;
}
/**/ /*带头结点的双链线性表中查找是否含有值为e的节点*/
int ListSearch(LinkList head, ElemType e)
... {
LinkList p;
p = head->next;
while(p != NULL && p->data != e)
...{
p = p->next;
}
if(p != NULL)
return 1;
else
return 0;
}
/**/ /*当第i个元素存在时,其值赋给e并返回1,否则返回0*/
int GetElem(LinkList head, int i, ElemType * e)
... {
int j;
LinkList p;
p = head->next;
j = 1;
while(p && j < i)
...{
p = p->next;
j++;
}
if(!p || j > i)
return 0;
*e = p->data;
return 1;
}
#include < stdlib.h >
#include " linklist.h "
/**/ /*产生头结点为head的空双向链表*/
int InitList(LinkList * head)
... {
*head = (LinkList)malloc(sizeof(LNode));
if(!(*head))
return 0;
(*head)->next = *head;
(*head)->prior = *head;
(*head)->data = 0; /**//*链表长度*/
return 1;
}
/**/ /*操作结果:销毁头结点为head双向链表*/
int DestroyList(LinkList * head)
... {
LinkList p, q;
p = (*head)->next;
while(p != *head)
...{
q = p->next;
free(p);
p = q;
}
free(*head);
*head = NULL;
return 1;
}
/**/ /*在头结点为head的双链线性表中第i个位置之前插入元素e,i的合法值为1≤i≤表长+1*/
int ListInsert(LinkList * head, int i, ElemType e)
... {
int j;
LinkList p, s;
j = 1;
p = (*head)->next;
while(p && j < i)
...{
p = p->next;
j++;
}
if(!(s = (LinkList)malloc(sizeof(LNode))))
return 0;
s->data = e;
s->prior = p->prior;
p->prior->next = s;
s->next = p;
p->prior = s;
return 1;
}
/**/ /*删除带头结点的双链线性表的第i个元素,i的合法值为1≤i≤表长*/
int ListDelete(LinkList * head, int i, ElemType * e)
... {
int j;
LinkList p;
j = 1;
p = (*head)->next;
while(p && j < i)
...{
p = p->next;
j++;
}
if(!p || j > i)
return 0;
*e = p->data;
p->prior->next = p->next;
p->next->prior = p->prior;
free(p);
return 1;
}
/**/ /*带头结点的双链线性表中查找是否含有值为e的节点*/
int ListSearch(LinkList head, ElemType e)
... {
LinkList p;
p = head->next;
while(p != NULL && p->data != e)
...{
p = p->next;
}
if(p != NULL)
return 1;
else
return 0;
}
/**/ /*当第i个元素存在时,其值赋给e并返回1,否则返回0*/
int GetElem(LinkList head, int i, ElemType * e)
... {
int j;
LinkList p;
p = head->next;
j = 1;
while(p && j < i)
...{
p = p->next;
j++;
}
if(!p || j > i)
return 0;
*e = p->data;
return 1;
}