线性结构源码:
#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指向新的为结点
}
}