阅读背景:

学习笔记------数据结构(C语言版) 线性表链式存储

来源:互联网 

//Function realization.cpp

#include "predefined.h"
#include"lianshijiegou.h"
//----线性表的动态分配链式存储结构函数实现---------
Status InitList_L(LinkList *L)//构造一个带头结点的空线性表
{
	(*L)=(LinkList)malloc(sizeof(LNode));
	if(!L) exit(OVERFLOW);
	(**L).next=NULL;
	(**L).data=0;
	return OK;
}
Status DestroyList_L(LinkList *L)//销毁线性表
{
	LinkList p,q;
	p=*L;
	while(p)
	{
		p=(**L).next;
		free(*L);
		(*L)=p;
	}
	return OK;
}
Status ClearList_L(LinkList *L)//重置线性表为空表,保留头结点
{
	LinkList p,q;
	p=*L;
	if(!p) return FALSE; 
	p=(*p).next;
	while(!p)
	{
		q=p;
		p=(*p).next;
		free(q);
	}
	(**L).next=NULL;
	return OK;
}
Status ListEmpty_L(LinkList L)//若为空表,返回TRUE,否则返回FALSE
{
	if(!((*L).next)&&L!=NULL) return TRUE;
	else return FALSE;
}
Status ListLength_L(LinkList L)//返回表中数据个数
{
	ElemType n=0;
	LinkList p;
	p=L;
	while(p=(*p).next) n++;
	return n;
}
Status GetElem_L(LinkList L,int i,ElemType *e)//L为带头结点的单链表的头指针。
//算法2.8:当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR。
{
	LinkList p;
    int j=1;
	p=(*L).next;
	while(p&&j<i)
	{
		p=(*p).next;
		++j;
	}
	if(!p||j>i) return ERROR;
   *e=(*p).data;
   return OK;
}
Status LocateElem_L(LinkList L,ElemType e,Status (*compare)(LinkList L,ElemType e))
//返回L中第一个与e满足关系compare数据元素的位序。若这样的数据元素不存在,则返回0。
{
	LinkList p;
	p=(*L).next;
	Status n;
	n=compare(p,e);
	if(n) return n;
	else return FALSE;
}
Status PriorElem_L(LinkList L,ElemType cur_e,ElemType *pre_e)
//若cur_e是L的数据元素,且不是第一个,则用e返回它的前驱,否则操作失败
{
	LinkList p=(*L).next;
	Status n;
	n=LocateElem_L(L,cur_e,equal);
	if(n==1||n==0) return FALSE;
	for(int i=2;i<n;i++)
	{
		p=(*p).next;
	}
	*pre_e=(*p).data;
	return OK;
}
Status NextElem_L(LinkList L,ElemType cur_e,ElemType *next_e)
//若cur_e是L的数据元素,且不是最后一个,则用e返回它的后继,否则操作失败
{
	LinkList p=(*L).next;
	while((*p).next!=NULL)
	{
		if((*p).data==cur_e) 
			{
				*next_e=(*(*p).next).data;
				return OK;
		    }
		else p=(*p).next;
	}
	return FALSE;
}
Status ListInsert_L(LinkList *L,int i,ElemType e)
//算法2.9:在带头结点的单链表L中第i个位置之前插入元素e。
{
	LinkList p,q;
	p=*L;
	if(i<1||i>ListLength_L(*L)+1) return FALSE;
	for(int j=1;j<i;j++)
	{
		p=(*p).next;
	}
	q=(LinkList)malloc(sizeof(LNode));
	(*q).data=e;
	(*q).next=(*p).next;
	(*p).next=q;
	return OK;
}
Status ListDelete_L(LinkList *L,int i,ElemType *e)
//算法2.10:在带头结点的单链线性表L中,删除第i个元素,并由e返回其值。
{
	LinkList p,q;
	p=*L;
	for(int j=1;j<i;j++)
	{
		p=(*p).next;
	}
	*e=(*(*p).next).data;
	q=(*p).next;
	(*p).next=(*(*p).next).next;
	free(q);
	return OK;
}
Status ListTraverse_L(LinkList L,Status (*visit)(LinkList L))
//依次对L中每个元素调用visit函数。
{
	LinkList p;
	Status m;
	p=(*L).next;
	while(p!=NULL)
	{
		m=visit(p);
		if(m) p=(*p).next;
		else return FALSE;
	}
	return OK;
}
void CreatList_L(LinkList *L,int n)
//算法2.11逆位序输入n个元素的值,建立带头结点的单链表L。
{
	(*L)=(LinkList)malloc(sizeof(LNode));
	if(!L) exit(OVERFLOW);
	(**L).next=NULL;
	(**L).data=0;
	LinkList p;
	for(int i=n;i>0;--i)
	{
		p=(LinkList)malloc(sizeof(LNode));
		printf("▼请输入第%d个数: ",i);
		scanf("%d",&(*p).data);
		(*p).next=(**L).next;
		(**L).next=p;
	}
}
#include "prede



你的当前访问异常,请进行认证后继续阅读剩余内容。

分享到: