顺序表
1.1源代码清单:
1.2顺序表数据结构:
本程序元素类型为int,读者可根据需求自行更改数据类型。
//线性表结构体
typedef struct{
int* elem; //线性表数据
int length; //线性表长度
int listSize; //线性表大小
}SqList;
1.3该顺序表设计到的方法:
int InitList(SqList &L); //初始化线性表
int DestroyList(SqList &L); //销毁线性表
int ClearList(SqList &L); //置空线性表
bool ListEmpty(SqList L); //判断是否为空
int ListLength(SqList &L); //线性表长度
int GetElem(SqList L, int i, int &e); //获取值
bool Compare(int a , int b); //比较
int LocateElem(SqList L, int e, bool(Compare)(int, int)); //定位
int PriorElem(SqList L, int cur_e , int &pre_e); //前驱
int NestElem(SqList L , int cur_e , int &next_e); //后继
int InsertList(SqList &L,int i ,int elem); //插入
int ListDelete(SqList &L, int i, int &e); //删除
void Visit(int x); //访问
void visitList(SqList L,void(Visit)(int)); //输出顺序表
1.4 SqList.h
#include <iostream>
#include<stdio.h>
using namespace std;
/* 状态码 */
#define TRUE 1 // 真/是
#define FALSE 0 // 假/否
#define OK 1 // 通过/成功
#define ERROR 0 // 错误/失败
//系统中已有此状态码定义,要防止冲突
#ifndef OVERFLOW
#define OVERFLOW -2 //堆栈上溢
#endif
//线性表的宏定义
#define listInitSize 20
#define listSizeStride 10 //空间增加的步长
//初始化线性表
int InitList(SqList &L){
//给线性表数据部分分配空间
L.elem = (int*)malloc(listInitSize * sizeof(int));
//分配空间失败
if(L.elem==NULL)
// 存储内存失败
exit(OVERFLOW);
//线性表长度
L.length=0;
//线性表大小
L.listSize=listInitSize;
return OK;
}
//销毁线性表
int DestroyList(SqList &L){
//确保线性表存在
if( L.elem == NULL)
return ERROR;
//释放内存
free(L.elem);
//置空指针
L.elem = NULL;
//长度内存的改变
L.length =0;
L.listSize=0;
return OK;
}
int ClearList(SqList &L){
if(L.elem==NULL)
return ERROR;
L.length=0;
return OK;
}
bool ListEmpty(SqList L){
return L.length==0?TRUE:ERROR;
}
int ListLength(SqList &L){
return L.length;
}
int GetElem(SqList L, int i, int &e){
if(L.elem==NULL)
return ERROR;
e = L.elem[i];
return OK;
}
bool Compare(int a , int b){
return a==b;
}
int LocateElem(SqList L, int e, bool(Compare)(int, int)){
if(L.elem==NULL)
return ERROR;
//下标
int i=0;
//新建指针指向数据域
int* p = L.elem;
//遍历
while(i<L.length && !Compare(*p++,e)){
++i;
}
if(i<L.length)
return i;
else
return -1;//没找到
}
int PriorElem(SqList L, int cur_e , int &pre_e){
if(L.elem == NULL)
return ERROR;
int i=0;
int *p = L.elem;
while(i<L.length && !Compare(*p++, cur_e)){
++i;
}
if(i==0||i>=L.length)
return ERROR;
else
pre_e = L.elem[i-1];
return OK;
}
int NestElem(SqList L , int cur_e , int &next_e){
if(L.elem == NULL)
return ERROR;
int i=0;
int *p = L.elem;
while(i<L.length && !Compare(*p++, cur_e)){
++i;
}
if(i>=L.length-1)
return ERROR;
else
next_e = L.elem[i+1];
return OK;
}
int InsertList(SqList &L,int i ,int elem){
if(L.elem == NULL)
return ERROR;
//插入位置是否正确
if(i<0 || i>L.length)
return ERROR;
int* newbase;//预计新建空间
//是否空间不足
if(L.length>=L.listSize){
newbase = (int*) realloc(L.elem, (L.listSize+listSizeStride)*sizeof(int));
//创建是否成功
if(newbase==NULL)
exit(OVERFLOW);
L.elem = newbase;
L.listSize += listSizeStride;
}
int*q = &L.elem[i]; //q指向要插入的位置
int*p = &L.elem[L.length-1]; //p指向数据尾部位
//右移元素
while(p>=q){
*(p+1) = *p;
p--;
}
//插入元素
*q = elem;
//表长加1
L.length++;
return OK;
}
int ListDelete(SqList &L, int i, int &e){
if(L.elem == NULL)
return ERROR;
//删除位置是否正确
if(i<0 || i>L.length)
return ERROR;
int *q = &L.elem[i] ;//指向要被删除的位置
int *p = &L.elem[L.length-1]; // 指向表尾元素
//要删除的元素赋值给e
e = *q;
while(q<p){
*q = *(q+1);
q++;
}
//表长减1
L.length--;
return OK;
}
void Visit(int x){
cout<<x<<'\t';
}
void visitList(SqList L,void(Visit)(int)){
if(L.elem==NULL)
cout<<"数据为空"<<endl;
for(int i=0;i<L.length;i++)
Visit(L.elem[i]);
cout<<'\n';
}
1.5 SqList.cpp
#include "SqList.h"
int main(int argc, const char * argv[]) {
SqList myList;
InitList(myList);
int num;
cout<<"输入数据数量:"<<endl;
cin>>num;
cout<<"输入数据:"<<endl;
int elem;
for(int i=0 ; i<num;i++){
cin>>elem;
InsertList(myList, i, elem);
}
visitList(myList, Visit);
cout<<"长度是:"<<ListLength(myList);
cout<<"是否为空:"<<ListEmpty(myList);
cout<<"输入一个想定位的数据:";
int data;
cin>>data;
cout<<data<<"定位是:"<<LocateElem(myList, data, Compare)<<endl;
int pre_data;
PriorElem(myList, data, pre_data);
int after_data;
NestElem(myList, data, after_data);
cout<<"前驱是:"<<pre_data<<'\t'<<"后继是:"<<after_data<<'\t';
cout<<"删除元素"<<endl;
int deldata;
ListDelete(myList, 3, deldata);
cout<<"删除的元素是:"<<deldata<<endl;
visitList(myList, Visit);
return 0;
}