设为首页 加入收藏

TOP

C_线性表(ADT)-单向循环链表的表示和实现(四)
2017-08-09 10:22:14 】 浏览:821
Tags:线性 ADT 单向 循环 表示 实现
空的线性表l*="" initlist(linklist="" &l)="" l="(LinkList)malloc(sizeof(LNode));" 产生头结点,并使l指向此头结点="" if(!l){="" 空的线性表构造失败="" printf("空的线性表构造失败,退出程序!\n");="" exit(0);="" l-="">next=L; //指针域指向头结点 } /*初始条件:单循环链表L存在*/ /*操作结果:摧毁单循环链表L*/ void DestroyList(LinkList &L) { LinkList q; LinkList p=L->next; //p指向头结点 while(p!=L) //没到表尾 { q=p->next; free(p); p=q; } free(L); L=NULL; } /*初始条件:单循环链表L存在*/ /*操作结果:将L重置为空表*/ Status ClearList(LinkList &L) { LinkList p,q; L=L->next; //L指向头结点 p=L->next; //p指向第一个结点 while(p!=L) //没到表尾 { q=p->next; free(p); p=q; } L->next=L; //头结点指针域指向自身 } /*初始条件:单循环链表L存在*/ /*操作结果:若L为空表,则返回TRUE,否则返回FALSE*/ Status ListEmpty(LinkList L) { if(L->next==L) //线性表为空表 return TRUE; else return FALSE; } /*初始条件:单循环链表L存在*/ /*操作结果:返回L中数据元素个数*/ int ListLength(LinkList L) { int i=0; LinkList p=L->next; //p指向头结点 while(p!=L) //没到表尾 { i++; p=p->next; } return i; } /*初始条件:单循环链表L存在*/ /*操作结果:当第i个元素存在时,其值赋给e并返回OK,否则返回FALSE。*/ Status GetElem(LinkList L,int i,ElemType &e) { int count=1; LinkList p=L->next->next; //p指向第一个结点 if(i<=0||i>ListLength(L)) //第i个元素不存在时 return ERROR; while(count next; count++; } e=p->data; //取第i个元素 return OK; } /*初始条件:单循环链表L存在,compare()是数据元素判定的函数*/ /*操作结果:返回L中第1个与e满足关系compare()的数据元素的位序。 若这样的数据元素不存在,则返回值为ERROR*/ Status LocateElem(LinkList L,ElemType e,Status(*compare)(ElemType,ElemType)) { int i=0; LinkList p=L->next->next; //p指向第一个结点 while(p!=L->next) { i++; if(compare(p->data,e)) //满足关系 return i; p=p->next; } return 0; } /*初始条件:单循环链表L存在*/ /*操作结果:若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱; 否则,操作失败,pre_e无定义*/ Status PriorElem(LinkList L,ElemType cur_e,ElemType &pre_e) { LinkList q; LinkList p=L->next->next; //p指向第一个结点 q=p->next; while(q!=L->next) //p没到表尾 { if(q->data==cur_e) { pre_e=p->data; return TRUE; } p=q; q=q->next; } return FALSE; //操作失败 } /*初始条件:单循环链表L存在*/ /*操作结果:若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的后继; 否则,操作失败,next_e无定义*/ Status NextElem(LinkList L,ElemType cur_e,ElemType &next_e) { LinkList p=L->next->next; //p指向第一个结点 while(p!=L) //p没有到达链表尾 { if(p->data==cur_e) { next_e=p->next->data; return TRUE; } p=p->next; } return FALSE; //操作失败 } /*初始条件:单循环链表L存在*/ /*操作结果:在L的第i个位置之前插入元素e*/ Status ListInsert(LinkList &L,int i,ElemType e) { LinkList s; LinkList p=L->next; //p指向头结点 int count=0; if(i<0||i>ListLength(L)+1) //无法在第i个元素前插入 return ERROR; while(count next; count++; } s=(LinkList)malloc(sizeof(LNode)); //生成新结点 s->data=e; //插入L中 s->next=p->next; p->next=s; if(p==L) //改变尾结点 L=s; return OK; } /*初始条件:单循环链表L存在*/ /*操作结果:删除L的第i个元素,并由e返回其值*/ Status ListDelete(LinkList &L,int i,ElemType &e) { LinkList p=L->next,q; //p指向头结点 int count=0; if(i<=0||i>ListLength(L)) //第i个元素不存在 return ERROR; while(count next; count++; } q=p->next; //q指向删除结点 p->next=q->next; e=q->data; if(L==q) //删除的是表尾元素 L=p; free(q); return OK; } /*初始条件:单循环链表L存在*/ /*操作结果:依次对每个数据元素调用函数visit()*/ void ListTraverse(LinkList L,void(*visit)(ElemType)) { LinkList p=L->next->next; //p指向第一个结点 while(p!=L->next) //p不指向头结点 { visit(p->data); p=p->next; } printf("\n"); } int main()
首页 上一页 1 2 3 4 下一页 尾页 4/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇C 语言getopt与go语言flag获取命.. 下一篇C语言关键字const用法

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目