博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【数据结构】双向循环线性表的基本操作--C++/C实现
阅读量:4312 次
发布时间:2019-06-06

本文共 3805 字,大约阅读时间需要 12 分钟。

本博客所有文章均已迁入到

//线性表的双向链表存储结构 typedef struct DuLNode {   ElemType data;   DuLNode *prior,*next; }DuLNode,*DuLinkList;

// 双链循环线性表(存储结构由c2-4.h定义)的基本操作(14个) Status InitList(DuLinkList &L) { // 产生空的双向循环链表L   L=(DuLinkList)malloc(sizeof(DuLNode));   if(L)   {     L->next=L->prior=L;     return OK;   }   else     return OVERFLOW; } Status DestroyList(DuLinkList &L) { // 操作结果:销毁双向循环链表L   DuLinkList q,p=L->next; // p指向第一个结点   while(p!=L) // p没到表头   {     q=p->next;     free(p);     p=q;   }   free(L);   L=NULL;   return OK; } Status ClearList(DuLinkList L) // 不改变L { // 初始条件:L已存在。操作结果:将L重置为空表   DuLinkList q,p=L->next; // p指向第一个结点   while(p!=L) // p没到表头   {     q=p->next;     free(p);     p=q;   }   L->next=L->prior=L; // 头结点的两个指针域均指向自身   return OK; } Status ListEmpty(DuLinkList L) { // 初始条件:线性表L已存在。操作结果:若L为空表,则返回TRUE,否则返回FALSE   if(L->next==L&&L->prior==L)     return TRUE;   else     return FALSE; } int ListLength(DuLinkList L) { // 初始条件:L已存在。操作结果:返回L中数据元素个数   int i=0;   DuLinkList p=L->next; // p指向第一个结点   while(p!=L) // p没到表头   {     i++;     p=p->next;   }   return i; } Status GetElem(DuLinkList L,int i,ElemType &e) { // 当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR   int j=1; // j为计数器   DuLinkList p=L->next; // p指向第一个结点   while(p!=L&&j
next; j++; } if(p==L||j>i) // 第i个元素不存在 return ERROR; e=p->data; // 取第i个元素 return OK; } int LocateElem(DuLinkList L,ElemType e,Status(*compare)(ElemType,ElemType)) { // 初始条件:L已存在,compare()是数据元素判定函数 // 操作结果:返回L中第1个与e满足关系compare()的数据元素的位序。 // 若这样的数据元素不存在,则返回值为0 int i=0; DuLinkList p=L->next; // p指向第1个元素 while(p!=L) { i++; if(compare(p->data,e)) // 找到这样的数据元素 return i; p=p->next; } return 0; } Status PriorElem(DuLinkList L,ElemType cur_e,ElemType &pre_e) { // 操作结果:若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱, // 前驱,否则操作失败,pre_e无定义 DuLinkList p=L->next->next; // p指向第2个元素 while(p!=L) // p没到表头 { if(p->data==cur_e) { pre_e=p->prior->data; return TRUE; } p=p->next; } return FALSE; } Status NextElem(DuLinkList L,ElemType cur_e,ElemType &next_e) { // 操作结果:若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的后继, // 否则操作失败,next_e无定义 DuLinkList p=L->next->next; // p指向第2个元素 while(p!=L) // p没到表头 { if(p->prior->data==cur_e) { next_e=p->data; return TRUE; } p=p->next; } return FALSE; } DuLinkList GetElemP(DuLinkList L,int i) // 另加 { // 在双向链表L中返回第i个元素的位置指针(算法2.18、2.19要调用的函数) int j; DuLinkList p=L; for(j=1;j<=i;j++) p=p->next; return p; } Status ListInsert(DuLinkList L,int i,ElemType e) // 改进算法2.18 { // 在带头结点的双链循环线性表L中第i个位置之前插入元素e,i的合法值为1≤i≤表长+1 DuLinkList p,s; if(i<1||i>ListLength(L)+1) // i值不合法 return ERROR; p=GetElemP(L,i-1); // 在L中确定第i-1个元素的位置指针p if(!p) // p=NULL,即第i-1个元素不存在 return ERROR; s=(DuLinkList)malloc(sizeof(DuLNode)); if(!s) return OVERFLOW; s->data=e; // 在第i-1个元素之后插入 s->prior=p; s->next=p->next; p->next->prior=s; p->next=s; return OK; } Status ListDelete(DuLinkList L,int i,ElemType &e) // 算法2.19 { // 删除带头结点的双链循环线性表L的第i个元素,i的合法值为1≤i≤表长+1 DuLinkList p; if(i<1||i>ListLength(L)) // i值不合法 return ERROR; p=GetElemP(L,i); // 在L中确定第i个元素的位置指针p if(!p) // p=NULL,即第i个元素不存在 return ERROR; e=p->data; p->prior->next=p->next; p->next->prior=p->prior; free(p); return OK; } void ListTraverse(DuLinkList L,void(*visit)(ElemType)) { // 由双链循环线性表L的头结点出发,正序对每个数据元素调用函数visit() DuLinkList p=L->next; // p指向头结点 while(p!=L) { visit(p->data); p=p->next; } printf("\n"); } void ListTraverseBack(DuLinkList L,void(*visit)(ElemType)) { // 由双链循环线性表L的头结点出发,逆序对每个数据元素调用函数visit()。另加 DuLinkList p=L->prior; // p指向尾结点 while(p!=L) { visit(p->data); p=p->prior; } printf("\n"); }

转载于:https://www.cnblogs.com/coderbean/p/4489056.html

你可能感兴趣的文章
定义函数
查看>>
网络虚拟化技术(二): TUN/TAP MACVLAN MACVTAP
查看>>
MQTT协议笔记之mqtt.io项目HTTP协议支持
查看>>
(转)jQuery中append(),prepend()与after(),before()的区别
查看>>
Tecplot: Legend和图像中 Dashed/Dash dot/Long dash 等虚线显示没有区别的问题
查看>>
win8 开发之旅(2) --连连看游戏开发 项目错误的总结
查看>>
视频转换工具ffmpeg
查看>>
一、 object c -基础学习第一天 如何定义一个类
查看>>
C#调用C++编译的DLL详解
查看>>
Kali Linux的安装
查看>>
我的大学生活-5-08-赵心宁
查看>>
SQLServer视图
查看>>
入门阶段
查看>>
Android中使用http协议访问网络
查看>>
vs win32 & MFC 指针默认位置
查看>>
Join 与 CountDownLatch 之间的区别
查看>>
js存cookie
查看>>
vc6下dll调试
查看>>
Ubuntu apt常用命令
查看>>
struts2 配置(部分)
查看>>