带头结点的双向循环链表的表示和实现
来源:互联网 发布:安徽八度网络 编辑:程序博客网 时间:2024/06/05 15:58
线性表的双向链表存储结构
typedef struct DuLNode{ ElemType data; DuLNode *prior, *next;}DuLNode, *DuLinkList;
带有头结点的双向循环链表的14个基本操作
void InitList(DuLinkList &L){ L = (DuLinkList)malloc(sizeof(DuLNode)); if (!L)exit(OVERFLOW); L->next = L->prior = L;}void ClearList(DuLinkList &L){ DuLinkList p = L->next;//p指向第1个结点 while (p != L){//p未指向头结点 p = p->next;//p指向下一个结点 free(p->prior);//释放p的前驱结点 } L->next = L->prior = L;//头结点的两个指针域均指向自身}void DestroyList(DuLinkList &L){ ClearList(L); free(L); L = NULL;}Status ListEmpty(DuLinkList L){ if (L->next == L && L->prior == L)return TRUE; else return FALSE;}int ListLength(DuLinkList L){ DuLinkList p = L->next;//p指向第1个结点 int i = 0; while (p != L)//p未指向头结点 { i++;//计数器+1 p = p->next;//p指向下一个结点 } return i;}Status GetElem(DuLinkList L, int i, ElemType &e){ int j = 1;//初始化,j为计数器,初值为1 DuLinkList p = L->next;//p指向第1个结点 while (p != L && j < i)//顺时针向后查找,直到p指向第i个元素或p指向头结点 { j++; p = p->next; } if (p == L || j > i)return ERROR;//第i个元素不存在 e = p->data; return OK;}int LocateElem(DuLinkList L, ElemType e, Status(*compare)(ElemType, ElemType)){ int i = 0;//计数器初值为0 DuLinkList p = L->next;//p指向第1个元素 while (p!=L)//p未指向头结点 { i++; if (compare(p->data, e))//找到这样的数据元素 return i;//返回其位序 p = p->next;//p指向下一个结点 } return 0;//满足关系的数据元素不存在}Status PriorElem(DuLinkList L, ElemType cur_e, ElemType &pre_e){ DuLinkList q, p = L->next->next;//p指向第2个元素 while (p != L){//p未指向头结点 if (p->data == cur_e){//p指向值为cur_e的结点 pre_e = p->prior->data;//将p的前驱结点的值赋给pre_e return OK; } p = p->next;//q指向p的后继 } return ERROR;}Status NextElem(DuLinkList L, ElemType cur_e, ElemType &next_e){ DuLinkList p = L->next->next;//p指向第2个元素 while (p!=L){//p未到表尾 if (p->prior->data == cur_e){//p所指结点的值为cur_e next_e = p->data;//将p所指结点的后继结点的值赋给next_e return OK; } p = p->next;//p指向下一个结点 } return ERROR;}DuLinkList GetElemP(DuLinkList L, int i){ int j; DuLinkList p = L;//p指向头结点 if (i < 0 || i < ListLength(L)) return NULL; for (j = 1; j <= i; j++)//p指向第i个结点 p = p->next;//p指向下一个结点 return p;}Status ListInsert(DuLinkList L, int i, ElemType e){ DuLinkList s, p; if (i <= 1 || i > ListLength(L) + 1) return ERROR; p = GetElemP(L, i - 1);//在L中确定第i个结点前驱的位置指针p if (!p) return ERROR;//p=NULL,即第i个结点的前驱不存在(设头结点为第1个结点的前驱) s = (DuLinkList)malloc(sizeof(DuLNode)); if (!s) return ERROR;//生成新结点失败返回ERROR s->data = e;//将e赋给新结点 s->prior = p;//新结点的前驱为第i-1个结点 s->next = p->next;//新结点的后继为第i个结点 p->next->prior = s;//第i-1个结点的后继指向新结点 p->next = s;//第i-1个结点的后继指向新结点 return OK;}Status ListDelete(DuLinkList L, int i, ElemType &e){ DuLinkList p; if (i < 1) return ERROR;//删除失败 p = GetElemP(L, i); if(!p) return ERROR;//p=NULL,即第i个元素不存在 e = p->data;//将第i个元素的值赋给e p->prior->next = p->next;//第i-1个结点的后继指向原第i+1个结点 p->next->prior = p->prior;//原第i+1个结点的前驱指向第i-1个结点 free(p); return OK;}void ListTraverse(DuLinkList L, void(*visit)(ElemType&)){ DuLinkList p = L->next;//p指向首元结点 while (p != L)//p不指向头结点 { visit(p->data); p = p->next; } printf("\n");}void ListTraverseBack(DuLinkList L, void(*visit)(ElemType&)){ DuLinkList p = L->prior;//p指向首元结点 while (p != L)//p不指向头结点 { visit(p->data); p = p->prior; } printf("\n");}
0 0
- 带头结点的双向循环链表的表示和实现
- 带头结点的双向循环链表
- 带头结点的双向循环链表
- 带头结点的双向循环链表
- 线性表和带头结点的双向循环链表
- 用模板实现顺序表和带头结点的双向循环链表
- C语言实现双向非循环链表(带头结点尾结点)的基本操作
- C语言实现双向非循环链表(带头结点尾结点)的节点插入
- C语言实现双向非循环链表(不带头结点)的基本操作
- C语言实现双向非循环链表(不带头结点)的逆序打印
- C语言实现双向非循环链表(不带头结点)的节点插入
- C语言实现双向非循环链表(不带头结点)的清空
- C实现头插法和尾插法来构建双向非循环链表(带头结点尾结点)
- 程序一:带头结点双向链表的简单实现
- 双向循环链表(带头结点)
- 单链表 、带头结点的单链表、循环链表 及其实现
- 带头结点的循环单向链表
- 【C++】模板实现带头节点的双向循环链表
- java内存泄露
- cocos2dx 3.x创建工程
- UVA 537
- SQL学习记录10:分组与聚集
- 更新sdk manager的方法
- 带头结点的双向循环链表的表示和实现
- UVA 10815(字符串)
- static、final修饰符、内部类
- 2.5 创建主角;2.5.1 创建脚本
- HDJ2020绝对值排序
- qsort与sort
- www外部加载
- 简历相关问题
- 绝对值排序