看了数据结构的书,为了动动手,仿着程杰老师的代码,写了下面一个演示顺序线性表的例子,优点是去元素的时候O(1)就能解决,不好的地方是浪费空间啊。
/*
* list.cpp
*
* Created on: 2013-4-1
* Author: CJ
*/
#include <iostream>
using namespace std;
#define MAXSIZE 20
typedef int ElemType;
//顺序链表的结构
typedef struct SQList{
ElemType data[MAXSIZE];//A[0]-A[MAXSIZE-1]
int length;
} SqList;
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int status;
//获得元素操作
status GetElem(SqList L, int i, ElemType *e){
//判断顺序链表是否为空
if(L.length==0 || i<0 ||i>L.length)
return ERROR;
//不为空,就取出I位置对应的元素
*e = L.data[i];
return OK;
}
//插入操作
status ListInsert(SqList *L, int i, ElemType e){
//判断、出错处理
int k;
if(L->length==MAXSIZE) return ERROR;
if(i<0 || i>L->length) return ERROR;
if(i<L->length-1){
//因为放到第I个位置,后面的元素都得让集体移动
for(k=L->length-1;k>i;k--){
L->data[k]=L->data[k-1];
}
}
L->data[i]=e;
L->length++;
return OK;
}
//删除操作
status ListDelete(SqList *L, int i, ElemType *e){
//先判断,出错的情况
int k;
if(L->length==0 || i<0 || i>=L->length ) return ERROR;
//是否删除表尾,否则
if(i<L->length-1){
*e = L->data[i];
for(k = i;k<L->length-1;k++)
{
L->data[k]=L->data[k+1];
}
}
L->length--;
return OK;
}
void test()
{
SqList L;
for(int i = 0; i<MAXSIZE;i++){
L.data[i]=0;
}
L.length=0;
ListInsert(&L,0,1);
ListInsert(&L,1,2);
ListInsert(&L,2,3);
ListInsert(&L,3,4);
for(int i = 0;i<L.length;i++)
{
ElemType e=-1;
GetElem(L,i,&e);
cout<<"Elememt "<<i<<" : "<<e<<endl;
}
ElemType ee=-1;
ListDelete(&L,2,&ee);
cout<<"delete Element: "<<ee<<endl;
for(int i = 0;i<L.length;i++)
{
ElemType e=-1;
GetElem(L,i,&e);
cout<<"Elememt "<<i<<" : "<<e<<endl;
}
}
int main(){
test();
return 0;
}