设为首页 加入收藏

TOP

C_线性表(ADT)-单向循环链表的表示和实现(二)
2017-08-09 10:22:14 】 浏览:820
Tags:线性 ADT 单向 循环 表示 实现
:返回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");
} 


 

嗯下面就是在VC中的测试

 

//单循环链表 
#include
  
   
#include
   
     #include
    
      #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 typedef int ElemType; typedef int Status; typedef struct LNode{ ElemType data; struct LNode *next; }LNode,*LinkList; Status compare(ElemType e1,ElemType e2) { if(e1==e2) return 0; else if(e1>e2) return 1; else if(e1<e2) return="" -1;="" }="" status="" equal(elemtype="" c1,elemtype="" c2)="" {="" if(c1="=c2)" true;="" else="" error;="" void="" visit(elemtype="" e)="" printf("%d="" \n",e);="" print(elemtype="" c)="" ",c);="" *操作结果:构造一个
首页 上一页 1 2 3 4 下一页 尾页 2/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇C 语言getopt与go语言flag获取命.. 下一篇C语言关键字const用法

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目