双向循环链表的基本操作

来源:互联网 发布:举报淘宝卖家虚假交易 编辑:程序博客网 时间:2024/04/28 23:21

总结一下双向循环链表的基本操作:

#include<stdio.h>#include<malloc.h>#define TRUE 1  #define FALSE 0 #define OVERFLOW -1#define OK 1  #define ERROR 0typedef int Status; /**Status是函数类型,其值是函数结果状态代码,如OK等**/typedef int ElemType;/**ElemType类型根据实际情况而定,这里假设为int**/ /**双向循环链表存储结构**/typedef struct DuLNode{ElemType data;struct DuLNode *prior,*next;}DuLNode,*DuLinkList;/**构造一个空的双向循环链表L**/void InitList_DuL(DuLinkList *L){ *L = (DuLinkList)malloc(sizeof(DuLNode));if(*L)(*L)->next = (*L)->prior = *L;else;//exit(OVERFLOW);}/**销毁双向循环链表L**/void DestroyList_DuL(DuLinkList *L){ DuLinkList q,p;p = (*L)->next;//p指向第一个结点 while(p != *L){//p未指到表头q = p->next;free(p);p = q;}free(*L);*L = NULL;}/**L已存,将L重置为空表**/void ClearList_DuL(DuLinkList L){DuLinkList q,p;p = L->next;//p指向第一个结点while(p != L){//p未指到表头q = p->next;free(p);p = q;}L->next = L->prior = L;//头结点的两个指针域均指向自身}/**返回L中数据元素个数**/int ListLength_DuL(DuLinkList L){ int i = 0;DuLinkList p;p = L->next;while(p != L){ i++;p = p->next;}return i;}/**当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR**/Status GetElemP_DuL(DuLinkList L,int i,ElemType *e){ int j = 1;//j为计数器DuLinkList p;p = L->next;//p指向第一个结点while(p != L && j < i){p = p->next;j++;}if(p == L || j > i)//第i个元素不存在return ERROR;*e = p->data;//取第i个元素return OK;}/**初始条件:L已存在,compare()是数据元素判定函数**/int LocateElem_DuL(DuLinkList L,ElemType e,Status (*compare)(ElemType,ElemType)){ /* 操作结果:返回L中第1个与e满足关系compare()的数据元素的位序。 *//* 若这样的数据元素不存在,则返回值为0 */int i = 0;DuLinkList p = L->next;//p指向第一个结点while(p != L){i++;if(compare(p->data,e))//找到这样的数据元素return i;p = p->next;}return 0;}/**操作结果:若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱,否则操作失败,pre_e无定义 **/Status PriorElem_DuL(DuLinkList L,ElemType cur_e,ElemType *pre_e){ DuLinkList p = L->next->next;//p指向第2个元素while(p != L){if(p->data == cur_e){*pre_e = p->prior->data;return TRUE;}p = p->next;}return FALSE;}/**操作结果:若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的后继,否则操作失败,next_e无定义 **/Status NextElem_DuL(DuLinkList L,ElemType cur_e,ElemType *next_e){ DuLinkList p = L->next->next;//p指向第2个元素while(p != L){if(p->prior->data == cur_e){*next_e = p->data;return TRUE;}p = p->next;}return FALSE;}/**在带头结点的双链循环线性表L中第i个位置之前插入元素e,i的合法值为1≤i≤表长+1**/Status ListInsert_DuL(DuLinkList L,int i,ElemType e){ DuLinkList p,s;p = GetElemP_DuL(L,i);//在L中确定插入的位置if(!p)//p=NULL,即第i个元素的前驱不存在return ERROR;if(!(s = (DuLinkList)malloc(sizeof(DuLNode))))return ERROR;s -> data = e;s -> prior = p -> prior;p -> prior -> next = s;s -> next = p;p -> prior = s;return OK;}/** 删除带头结点的双链循环线性表L的第i个元素,i的合法值为1≤i≤表长 **/Status ListDelete(DuLinkList L,int i,ElemType *e){DuLinkList p;if(i < 1)//i值不合法return ERROR;p = GetElemP_DuL(L,i);  //在L中确定第i个元素的位置指针pif(!p)//p=NULL,即第i个元素不存在return ERROR;*e = p->data;p->prior->next = p->next;p->next->prior = p->prior;free(p);return OK;}


0 0
原创粉丝点击