实现顺序表的基本操作,包括顺序表的建立,查找,求长度,查找前驱,插入,删除,输出等函数
#include <iostream> #include <cstdio> #include <cstdlib> using namespace std; #define OK 1 #define ERROR 0 #define OVERFLOW -1 #define List_INIT_SPACE 100 //存储空间初始分配量 #define List_INC_SPACE 10 //存储空间分配增量 typedef int ElemType; typedef struct { ElemType *elem; //存储空间基址 int length; //当前长度 int listsize; //当前分配的存储容量(以sizeof(ElemType)为单位) }Sq_List; /****---------------------------------------------------------------------------------****/ //函数名: Sq_ListInit(Sq_List &l) //参数: (传入)Sq_List L,顺序表结构体L,存储线性表相关信息(&相当于传入L的地址) //返回值: int型,返回1表示创建成功,0表示失败 //功能: 初始化一个空顺序表 /*****--------------------------------------------------------------------------------****/ int Sq_ListInit(Sq_List &L) { //在内存中分配空间 L.elem = (ElemType*)malloc(List_INIT_SPACE*sizeof(ElemType)); if(!L.elem) exit(OVERFLOW); //存储分配失败 //构造一个空线性表L L.length = 0; L.listsize = List_INIT_SPACE; //初始存储容量 return OK; }//函数Sq_listInit结束 /****----------------------------------------------------------------------****/ //函数名: LocateElem(Sq_List L, ElemType e) //参数: (传入)Sq_List L,顺序表 // (传入)ElemType e,定位元素 //返回值: int型,返回定位位置,0表示失败 //功能: 在顺序表中定位元素 /****----------------------------------------------------------------------****/ int LocateElem(Sq_List L, int e) { int i = 1; //定义线性表指针 int * p = L.elem; //查找元素e while(i < L.length && *p++ != e) { ++i; } if(i <= L.length) { return i; } else { return ERROR; } } //求顺序表的长度 int GetListLength(Sq_List L) { return L.length; } /****---------------------------------------------------------------------****/ //函数名: Sq_listInsert(Sq_List &L, int i, ElemType e) //参数: (传入)Sq_List &l 顺序表 // (传入)int i 插入位置 // (传入)ElemType e 插入元素 //返回值: 1表示成功,0表示操作失败 //功能: 在顺序表L中的第i个位置前插入新元素e //备注: i的和合法值为1<= i <= 线性表长度+1 /****---------------------------------------------------------------------****/ int Sq_ListInsert(Sq_List &L, int i, ElemType e) { //判断位置是否合法 if(i < 1 || i > L.length+1) { cout <<"i 的值不合法!" << endl; return 0; } //超出空间进行再分配 if(L.length >= L.listsize) { int *newspace; newspace = (ElemType*) realloc(L.elem,(L.listsize+List_INC_SPACE)*sizeof(ElemType)); if(!newspace) exit(OVERFLOW); //存储分配失败 L.elem = newspace; //新基址 L.listsize += List_INC_SPACE; //增加存储容量 } int *p, *q; //定义指向线性表位置i和尾的指针 q = &(L.elem[i-1]); //q指针指向插入位置i的前一个 for(p = &(L.elem[L.length-1]); p >= q; --p) { *(p+1) = *p; //插入元素之后的元素右移 } *q = e; //把元素e放在位置i处 ++L.length; //线性表长度增加1 return OK; }//Sq_ListInsert结束 /****------------------------------------------------------------------****/ //函数名: Sq_listDelete(Sq_list &L, int i, ElemType &e) //参数: (传入)Sq_list &L 顺序表 // (传入)int i 删除位置 // (传出)ElemType &e删除元素 //返回值: 1表示成功,0表示操作失败 //功能: 在顺序线性表L中删除第i个元素,用e返回其值 //备注: i的合法取值为1 <= i <= 线性表长度 /****------------------------------------------------------------------****/ int Sq_listDelete(Sq_List &L, int i, ElemType &e) { //判断位置是否合法 if(i < 1|| i > L.length+1) { cout << " i的值不合法!" << endl; return 0; } int *p, *q; //定义指向线性表位置i和尾的指针 p = &(L.elem[i-1]); //p为被删除元素的位置 e = *p; //取删除元素的值 q = L.elem + L.length -1; //q指针指向线性表最后一个元素 for(++p; p <= q; ++p) *(p-1) = *p; //被删除元素之后的元素左移 --L.length; //线性表长度减1 return OK; }//函数Sq_ListDelete结束 //-------------------testing program--------------------------- int main() { Sq_List R; //定义实参 int flag; //为了判断调用成功与否,可以检查flag的值,或者见插入操作的调用方法 //if(flag == 1) cout << "成功"; //else cout << "失败"; flag = Sq_ListInit(R); // 调用方法 int i = 1; int elem; cout << "the length of current list is " << GetListLength(R) << endl; cout << "input the element: "; cin >> elem; if(Sq_ListInsert(R, i, elem)) cout << "successed! " << endl; cout << "the length of current list is " << GetListLength(R) << endl; //Sq_ListInsert(R, i, elem); //或者直接调用 return 0; }
时间: 2024-11-11 22:56:56