代码,用c++实现线性链表

#include <iostream> #include <stdio.h> #include <malloc.h> using namespace std; #define INITIALSIZE 10 // 线性表存储空间的分配量,即数组长度 #define Status int //定义返回状态 #define OK 1 #define error 0 //#define LISTINCREMENT=10; typedef struct { int * elem; //定义数组 int length; // 当前长度 ,线性表的元素个数,并不是数组长度 int listsize; //数组的长度 } SqList; // 俗称 顺序表 Status InitList(SqList *L); Status ListEmpty(SqList *L); int ListLength(SqList *L); int getElem(SqList *L,int i);//返回i的元素 int locateElem(SqList *L,int e);//返元素的位置 Status ListInsert(SqList *L,int i,int e); int ListDelete(SqList *L,int i);//删除第i个元素返回这个元素 void Traverse(SqList *L);//遍历列表 Status InitList(SqList * L){ L->elem=(int *)malloc(sizeof(int)*INITIALSIZE); if (!L->elem){cout<<"分配失败"<<endl;exit(-1);} L->length=0; L->listsize=INITIALSIZE; return OK; } Status ListEmpty(SqList * L){ if (L->length==0)return OK; } int ListLength(SqList * L){return L->length;} Status ListInsert(SqList * L,int i,int e){ if (i<1||i>L->length+1){cout<<"赋值失败"<<endl;return error;}//如果输入的下表不足1,或者大于数组的长度,就返回错误 if (L->length>=L->listsize){ int * newbase=(int *)realloc(L->elem,sizeof(int)*((L->listsize<<2)+L->listsize)); if (!newbase)return error; L->elem=newbase; L->listsize+=(L->listsize<<2); } int * q=&(L->elem[i-1]);//插入位置 for(int * p=&(L->elem[L->length-1]);p>=q;--p) *(p+1)=*p; *q=e; ++L->length; return OK; } void Traverse(SqList * L){ for (int i=0;i<L->length;++i){ cout<<L->elem[i]<<" "; } } int getElem(SqList *L,int i){ if (i<1||i>L->length)return error; return L->elem[i]; } int locateElem(SqList *L,int e){ // int *p = L; // for (int * q=L->elem[L->length-1];q>p;++q){ // if (*q==e)return // } for (int i=0;i<L->length;i++){ if (L->elem[i]==e)return i; } return -1; } int ListDelete(SqList *L,int i){ if (i<1||i>L->length+1){cout<<"树枝不对"<<endl;return error;} //删除的位置 删除之后依次前移 for (int * q=&(L->elem[i+1]);q<&(L->elem[L->length-1]);q++){ *(q-1)=*q; } --L->length; return OK; } int main(){ SqList mm; if (InitList(&mm)){ for (int i=1;i<=30;i++){ ListInsert(&mm,i,i); } Traverse(&mm); ListDelete(&mm,2); cout<<endl<<"删除之后"<<mm.length<<endl; Traverse(&mm); cout<<endl<<mm.elem[2]<<endl; cout<<locateElem(&mm,12); }; return 0; }