线性表【数据结构c语言版】(3)

线性表的链式表示和实现

用任意存储单元存储线性表的数据元素(存储单元可以连续也可以不连续)

结点包括数据域和指针域

链表的存取必须从头指针开始

头指针指示链表中第一个结点
线性表最后一个结点的指针为空

一.线性表的存储结构

typedef struct LNode{
	ElemType data;
	struct LNode *next; 
}LNode,*LinkList;

二.带有头结点的单链表的基本操作(12个)

  • 构造空线性表
void InitList(LinkList &L){
	L=(LinkList)malloc(sizeof(LNode));
	if (!L) exit(OVERFLOW);
	L->next=NULL;//头结点的指针域为空 
}
  • 销毁线性表L
void DestriyList(LinkList &L){
	LinkList q;
	while(L){
		q=L->next;
		free(L);
		L=q;
	}
} 
  • 将L重置为空表
void ClearList(LinkList L)//不改变L
{
	LinkList p=L->next;//p指向第一个结点 
    L->next=NULL;//头结点指针域为空
	DestroyList(p);//销毁p所指的单链表 
} 

重置为空链表即在不销毁头结点的前提下销毁剩下的结点

  • 判断L是否为空,为空返回True
Status ListEmpty(LinkList L){
	if(L->next)//非空
	return FALSE;
	else return TRUE; 
} 
  • 返回L中元素个数
int ListLength(LinkList L){
	int i=0;
	LinkList p=L->next;//p指向第一个结点
	while(p){
		i++;
		p=p->next;
	}
	return i; 
}
  • 第i个元素存在,赋值给e并返回OK,否则返回ERROR
Status GetElem(LinkList L,int i,ElemType &e){
	LinkList p=L->next;
	int j=1;
	while(j<i&&p){
		p=p->next;
		j++;
	}
	if(!p||j>i)return ERROR;
	e=p->data;
	return OK;
}
  • 返回第一个与e满足compare关系的元素位序,如果不存在返回0
int LocateElem(LinkList L,ElemType e,Status(*compare)(ElemType,ElemType))
{
	int i=0;//计数器初值为0
	LinkList p=L->next;
	while(p)//未到表尾
	{
		i++;
		if(compare(p->data,e))return i;
		p=p->next;
	 } 
	 return 0;
}
  • 返回cur_e的前驱pre_e,返回OK;若操作失败pre_e无定义,返回ERROR
Status PriorElem(LinkList L,ElemType cur_e,ElemType &pre_e){
	LinkList q,p=L->next;
	for(p&&p->next){
		q=p->next;
		if(q->data==cur_e){
			pre_e=p->data;
			return OK;
		}
		q=p;//p的后继不为cur_e,p后移 
	}
	return ERROR; 
}
  • 返回cur_e的后继next_e
Status NextElem(LinkList L,ElemType cur_e,ElemType next_e){
	LinkList p=L->next;
	while(p&&p->next){
		if(p->data==cur_e){
			next_e=p->next->data;
			return OK;
		}
		p=p->next;
	}
	return ERROR;
} 
  • 在第i个位置插入元素e
Status ListInsert(LinkList &L,int i,ElemType e){
	LinkList p=L;
	j=0;
	while(j<i-1&&p){
		p=p->next;
		j++;
	}
	if(!p||j>i-1)return ERROR;
	s=(LinkList)malloc(sizeof(LNode));
	s->data=e;
	s->next=p->next;
	p->next=s;
	return OK;
}
  • 在L中删除第i个元素,并用e返回其值
Status DeleteList(LinkList &L,int i,ElemType &e){
	int j=0;
	LinkList q,p=L;
	while(j<i-1&&p){
		j++;
		p=p->next;
	}
	if(j>i-1||!p->next)return ERROR;
	q=p->next;
	e=q->data;
	p->next=q->next;
	free(q);
	return OK;
}
  • 依次对L中的每个元素调用visit()
void ListTraverse(LinkList L,void(*visit)(ElmeType)){
	LinkList p=L->next;
	while(p){
		visit(p->data);
		p=p->next;
	} 
	printf("\n")
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值