【青岛大学】王卓老师数据结构_线性表代码

线性结构源码:

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFESIBLE -1
#define OVERFLOW -2

typedef int Status;
typedef char ElemType;

//线性表L的初始化(参数用引用)
Status InitList_Sq(SqList &L){  	//构造一个空的顺序表L
	L.elem = new ElemType[MAXSIZE];	//为顺序表分配空间	
	if (!L.elem) exit(OVERFLOW);	//存储分配失败
	L.length = 0;
	return OK;
}

//销毁线性表L
void DestroyList(SqList &L){
	if (L.elem) delete L.elem;	//释放存储空间
}

//清空线性表L
void ClearList(SqList &L){
	L.length = 0;	//将线性表的长度置为0
}

//求线性表L的长度
int GetLength(SqList L){
	return (L.length);
}

//判断线性表L是否为空
int IsEmpty(SqList L){
	if(L.length == 0) return 1;
	else return 0;
}

//逻辑位序(a1,a2...,an)和物理位序(0,1,...n-1)相差1
//顺序表的取值(根据位置i获取相应位置数据元素的内容)
int GetElem(SqList L,int i,ElemType &e){
	if(i<1 || i>L.length) return ERROR;//判断i值是否合理
	e=L.elem[i-1];	//第i-1个单元存储着第i个数据
	return OK;
}

//顺序表的查找
int LocateElem(SqList L,ElemType e){
	for(i=0;i<L.length;i++)
		if(L.elem[i] == e) return i+1;	//查找成功,返回序号,序号与位序差1
	return 0;
}

//顺序表的插入
Status ListInsert_Sq(SqList &L,int i,ElemType e ){
	if (i<1 || i>L.length+1) return ERROR;	//i值不合法
	if (L.length == MAXSIZE) return ERROR;	//当前存储空间已满
	for (j=L.length-1;j>=i-1;j--)
		L.elem[j+1]=L.elem[j];	//插入位置及之后的元素后移
	L.elem[i-1]=e;				//将新元素e放入第i个位置
	L.length++;
	return OK;
}


//顺序表的删除
Status ListDelete_Sq(SqList &L,int i){
	if((i<1)||(i>L.length)) return ERROR;	//i值不合法
	for(j=i;j<=L.length-1;j++)	
		L.elem[j-1] = L.elem[j];	//被删除元素之后的元素前移
	L.length--;
	return OK;
}



单链表源码:

typedef struct Lnode{  //声明结点的类型和指向结点的数据类型
    ElemType data;     //结点的数据域
    struct Lnode *next;//结点的指针域
}Lnode,*LinkList; //LinkList为指向结构体Lnode的指针类型、Lnode为结点

//初始化单链表
Status InitList_L(LinkList &L){
    L=new LNode;    //L=(LinkList)malloc(sizeof(LNode))
    L->next=Null;
    return OK;
}

//判断单链表是否为空
int ListEmpty(LinkList L){
	if(L->next)
		return 0;
	else 
		return 1;
}

/*
 *销毁单链表L 
 *各个结点依次释放
 **/
Status DestoryList_L(LinkList &L){
	Lnode *p;
	while(L){
		p=L;
		L=L->next;
		delete p;
	}
}

/*
 *清空单链表L 
 *依次释放所有结点,并将头结点指针域设置为空
 **/
Status ClearList(LinkList &L){	//将L重置为空表
	Lnode *p,*q;
	p=L->next;
	while(p){
		q=p->next;
		delete p;
		p=q;
	}
	L->next = NULL;	//头指针域为空
	return OK;
}

//求单链表L的表长
int ListLength_L(LinkList L){
	LinkList p;
	p=L->next;	//p指向第一个结点
	i=0;
	while(p){	//遍历单链表,统计结点数
		i++;
		p=p->next;
	}
}
/*
 *获取线性表L中的某个数据元素内容,通过变量e返回
 **/
Status GetElem_L(LinkList L,int i,ElemType &e){
	p=L->next;
	j=1;
	while(p&&j<i){	//向后扫描,直到p指向第i个元素或p为空
		p=p->next;
		++j;
	}
	if(!p || j>i)	//第i个元素不存在
		return ERROR;
	e = p->data;
	return OK;
}



/*
 *查找元素地址
 *在线性表L中查找值为e的数据元素
 *找到返回e的数据元素地址;找不到返回NULL
 **/
Lnode* LocateElem_L(LinkList L,ElemType e){
	p=L->next;
	while(p && p->data!=e)
		p=p->next;
	return p;
}
/*
 *查找元素位置
 *在线性表L中查找值为e的数据元素
 **/
int LocateElem_L(LinkList L,ElemType e){
	p=L->next;
	int j=1;
	while(p && p->data!=e){
		p=p->next;
		j++;
	}		
	if(p) return j;
	else return 0;
}

/*
 *插入元素e
 *在L中第i个元素之前插入数据元素e
 **/
Status ListInsert_L(LinkList &L,int i,ElemType e){
	p=L;
	int j=0;
	while(p && j<i-1){	//寻找第i-1个结点,p指向i-1结点
		p=p->next;
		++j;
	}
	if(!p || j>i-1)		//i大于表长+1或小于1,插入位置非法
		return ERROR;	
	s=new Lnode;		
	s->data=e;			//生成新结点s,将结点s的数据域置为e
	s->next=p->next;	//将结点s插入L中
	p->next=s;
}

/*
 *删除元素e
 *将L中第i个数据元素删除
 **/
Status ListDelete_L(LinkList &L,int i,ElemType &e){
	p=L;
	int j=0;
	while(p->next && j<i-1){	//寻找第i个结点,并令p指向其前驱
		p=p->next;
		++j;
	}
	if(!(p->next) || j>i-1) return ERROR;	//删除位置不合理
	q=p->next;		//临时保存被删结点的地址以备释放
	p->next = q->next; //改变删除结点前驱结点的指针域
	//p->next = p->next->next;
	e=q->data;		//保存删除结点的数据域
	delete q;		//释放删除结点的空间
	return OK;
}
	
	
/*
 *头插法
 **/
void CreateList_H(LinkList &L,int n){
	L=new Lnode;
	L->next = NULL; //先建立一个带头结点的单链表
	for(i=n;i>0;--i){
		p = new Lnode; //C:p=(Lnode*)malloc(sizeof(Lnode));
		cin>>p->data;	//scanf(&p->data);
		p->next = L->next;
		L->next= p;
	}
}

/*
 *尾插法
 **/
void CreateList_R(LinkList &L,int n){
	L=new Lnode;
	L->next = NULL; //先建立一个带头结点的单链表
	r=L;	//尾指针r指向头结点
	for(i=0;i<n;++i){
		p = new Lnode; //C:p=(Lnode*)malloc(sizeof(Lnode));
		cin>>p->data;	//scanf(&p->data);
		p->next = NULL;
		r->next = p;	//插入表尾
		r=p;	//r指向新的为结点
	}
}









 

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值