数据结构线性表顺序存储C++实现

来源:互联网 发布:mac电池循环次数 cmd r 编辑:程序博客网 时间:2024/05/16 05:45
#include <iostream>
#include <stdlib.h>
using namespace std;


#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OVERFLOW -2
#define List_Init_Size 20
#define List_IncreMent 10 


typedef int ElemType;
typedef int Status;
typedef struct{
  ElemType *elems;//数据元素组成的数组
  int length;//元素个数
  int listsize;//线性表长度
}SqList;


Status compare(ElemType e1,ElemType e2);
Status add(ElemType &e);
Status InitSqList(SqList &list);
Status DestorySqList(SqList *list_p);
Status ClearSqList(SqList &list);
Status ListEmpty(SqList list);
int LIstLength(SqList list);
Status getElem(SqList list,ElemType &e,int i);
int LocateElem(SqList list,ElemType e,Status (*compare)(ElemType e1,ElemType e2));
Status PriorElem(SqList list,ElemType cur_e,ElemType &pre_e);
Status NextElem(SqList list,ElemType cur_e,ElemType &pre_e);
Status ListInsert(SqList &list,ElemType e,int i);
Status ListDelete(SqList &list,int i,ElemType &e);
Status ListTraverse(SqList &list,Status (*add)(ElemType &e));
Status CoutSqList(SqList list);


int main(){
  SqList list;
  cout<<"初始化顺序线性表"<<endl;
  InitSqList(list);
  cout<<"顺序线性表初始化完成"<<endl;
  cout<<"线性表是否为空:"<<ListEmpty(list)<<endl;
  cout<<"放置数据元素1,2,3,4"<<endl;
  ListInsert(list,1,0);
  ListInsert(list,2,1);
  ListInsert(list,3,2);
  ListInsert(list,4,3);
  cout<<"线性表是否为空:"<<ListEmpty(list)<<endl;
  CoutSqList(list);
  cout<<"线性表长度为:"<<LIstLength(list)<<endl;
  ElemType e;
  getElem(list,e,1);
  cout<<"获取线性表第二个元素为"<<e<<endl;
  cout<<"元素1在表中下标:"<<LocateElem(list,1,compare)<<endl;
  cout<<"元素3在表中下标:"<<LocateElem(list,3,compare)<<endl;
  ListDelete(list,2,e);
  cout<<"删除表中第三个元素,此值为"<<e<<endl;
  cout<<"线性表长度为:"<<LIstLength(list)<<endl;
  CoutSqList(list);
  cout<<"自增1"<<endl;
  ListTraverse(list,add);
  CoutSqList(list);
  Status status;
  status=PriorElem(list,1,e);
  if(status)
  cout<<"找到元素1前面的值为:"<<e<<endl;
  else
  cout<<"找不到元素1前面的值"<<endl;
  status=NextElem(list,2,e);
  if(status)
  cout<<"找到元素2后面的值为:"<<e<<endl;
  else
  cout<<"找不到元素2后面的值"<<endl;
  return OK;
}


Status InitSqList(SqList &list){
  list.elems=(ElemType *)malloc(List_Init_Size*sizeof(ElemType));
  if(!list.elems)
  exit(OVERFLOW);
  list.length=0;
  list.listsize=List_Init_Size;
  return OK;
}




Status DestorySqList(SqList *list_p){
  free(list_p);
  return OK;
}


Status ClearSqList(SqList &list){
  list.length=0;
  return OK;
}


Status ListEmpty(SqList list){
return list.length==0?TRUE:FALSE;
}


int LIstLength(SqList list){
return list.length;
}


Status getElem(SqList list,ElemType &e,int i){
    if(i<0 || i>=list.length)
return ERROR;
e=list.elems[i];
return OK;
}


int LocateElem(SqList list,ElemType e,Status (*compare)(ElemType e1,ElemType e2)){
    for(int i=0;i<list.length;i++){
if(compare(e,list.elems[i]))
return i;
}
return -1;
}


Status PriorElem(SqList list,ElemType cur_e,ElemType &pre_e){
    for(int i=1;i<list.length;i++){
if(compare(cur_e,list.elems[i])){
pre_e=list.elems[i-1];
    return OK;
}
}
return ERROR;
}


Status NextElem(SqList list,ElemType cur_e,ElemType &pre_e){
    for(int i=0;i<list.length-1;i++){
if(compare(cur_e,list.elems[i])){
  pre_e=list.elems[i+1];
  return OK;
}
}
return ERROR;
}


Status ListInsert(SqList &list,ElemType e,int i){
    if(i<0 || i>list.length){
  return ERROR;
}
if(list.length==list.listsize)
  list.elems=(ElemType *)realloc(list.elems,List_IncreMent*sizeof(ElemType));//扩大内存
if(!list.elems)
exit(OVERFLOW);
for(int j=list.length-1;j>i;j--){
  list.elems[j+1]=list.elems[j];
}
list.elems[i]=e;
list.length++;
return OK;
}


Status ListDelete(SqList &list,int i,ElemType &e){
    if(i<0 || i>list.length-1)
return ERROR;
e=list.elems[i];
for(int j=i+1;j<list.length;j++){
  list.elems[j-1]=list.elems[j];
}
list.length--;
return OK;
}


Status ListTraverse(SqList &list,Status (*visit)(ElemType &e)){
    for(int i=0;i<list.length;i++){
   if(!visit(list.elems[i]))
   return ERROR;
}
return OK;
}


Status compare(ElemType e1,ElemType e2){
return e1==e2?TRUE:FALSE;
}


Status add(ElemType &e){
e++;
return OK;
}


Status CoutSqList(SqList list){
cout<<"输出线性表"<<endl;
    if(list.length==0)
cout<<"线性表为空"<<endl;
for(int i=0;i<list.length;i++)
cout<<list.elems[i]<<endl;
return OK;
}
阅读全文
0 0
原创粉丝点击