从零开始学数据结构

    技术2022-07-10  133

    一.线性表

    1. 顺序表

    概念:用一组地址连续的存储单元依次存储线性表的数据元素,通常使用数组。 特点:逻辑上相邻的数据元素,其物理次序也是相邻的。

    定义和基本操作的实现:

    1.宏定义:

    #include <iostream> #define OK 1 #define ERROR 0 #define OVERFLOW -2 using namespace std; const int MAXSIZE=5; typedef int ElemType;

    2.结构体:

    typedef struct{ int *elem; int length; }SqList;//构造一个结构体,elem为储存空间的基地址,length为当前长度,结构类型为SqList;

    3.创建一个线性表:

    int InitList(SqList &L){ L.elem=new ElemType[MAXSIZE]; if(!L.elem) exit(OVERFLOW); L.length=0; return OK; }//构造一个空的顺序表L

    4.输入元素:

    int Input(SqList &L,int n){ cout<<"请输入元素:"<<endl; for(int i=0;i<n;i++){ cin>>L.elem[i]; L.length++; } return OK; }//输入元素

    5.定位:

    int LocateElem(SqList L,ElemType e){ int flag=0; for(int i=0;i<L.length;i++){ if(L.elem[i]==e){ cout<<i+1<<endl; flag=1; } } if(flag==0) cout<<"未找到目标元素!"<<endl; return 0; }//定位

    6.插入:

    int ListInsert(SqList &L,int i,ElemType e){ if((i<1)||(i>L.length+1)) return ERROR; if(L.length==MAXSIZE) return ERROR; for(int j=L.length-1;j>=i-1;j--){ L.elem[j+1]=L.elem[j]; } L.elem[i-1]=e; ++L.length; return OK; }//插入

    7.删除:

    int ListDelete(SqList &L,int i){ if((i<1)||(i>L.length)) return ERROR; for(int j=i;j<=L.length-1;j++){ L.elem[j-1]=L.elem[j]; } --L.length; return OK; }//删除

    8.输出:

    int Output(SqList &L,int i){ cout<<"新的线性表为:"<<endl; for(int j=0;j<i;j++){ cout<<L.elem[j]<<' '; } return OK; }

    完整代码:

    #include <iostream> #define OK 1 #define ERROR 0 #define OVERFLOW -2 using namespace std; const int MAXSIZE=5; typedef int ElemType; typedef struct{ int *elem; int length; }SqList;//构造一个结构体,elem为储存空间的基地址,length为当前长度,结构类型为SqList; int InitList(SqList &L){ L.elem=new ElemType[MAXSIZE]; if(!L.elem) exit(OVERFLOW); L.length=0; return OK; }//构造一个空的顺序表L int Input(SqList &L,int n){ cout<<"请输入元素:"<<endl; for(int i=0;i<n;i++){ cin>>L.elem[i]; L.length++; } return OK; }//输入元素 int LocateElem(SqList L,ElemType e){ int flag=0; for(int i=0;i<L.length;i++){ if(L.elem[i]==e){ cout<<i+1<<endl; flag=1; } } if(flag==0) cout<<"未找到目标元素!"<<endl; return 0; }//定位 int ListInsert(SqList &L,int i,ElemType e){ if((i<1)||(i>L.length+1)) return ERROR; if(L.length==MAXSIZE) return ERROR; for(int j=L.length-1;j>=i-1;j--){ L.elem[j+1]=L.elem[j]; } L.elem[i-1]=e; ++L.length; return OK; }//插入 int ListDelete(SqList &L,int i){ if((i<1)||(i>L.length)) return ERROR; for(int j=i;j<=L.length-1;j++){ L.elem[j-1]=L.elem[j]; } --L.length; return OK; }//删除 int Output(SqList &L,int i){ cout<<"新的线性表为:"<<endl; for(int j=0;j<i;j++){ cout<<L.elem[j]<<' '; } return OK; } int main(){ SqList MYL; char a; a='Y'; int data,i,num; int key=0; InitList(MYL); cout<<"请输入元素个数:"<<endl; cin>>num; int current=num; Input(MYL,num); while(a=='Y'){ cout<<"请选择你需要的帮助(0=定位,1=插入,2=删除)"<<endl; cin>>key; if(key==0){ cout<<endl<<"请输入所需要定位的元素:"; cin>>data; LocateElem(MYL,data); } if(key==1){ cout<<endl<<"请输入要插入的元素:"; cin>>data; cout<<endl<<"请输入要插入的位置:"; cin>>i; ListInsert(MYL,i,data); current=current+1; Output(MYL,current); } if(key==2){ cout<<endl<<"请输入要删除的位置:"; cin>>i; ListDelete(MYL,i); current=current-1; Output(MYL,current); } cout<<endl<<"请问是否继续?(Y:继续 N:结束)"<<endl; getchar(); cin>>a; } return 0; }
    Processed: 0.012, SQL: 9