VS2010编译通过测试
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define TURE 1
#define FLASE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1 //不可行
#define OVERFLOW -1
#define LIST_INIT_SIZE 50 //线性表初始分配空间
#define LISTINCREMENT 5 //线性表增量
typedef int State; //函数状态
typedef int ElemType; //元素为整形
/*********线性表类型结构定义************/
typedef struct
{
ElemType *elem; //储存空间基址
int length; //当前长度
int listsize; //当前分配的容量
}Sqlist;
/****************************************/
// Sqlist L; //定义全局线性表
State InitList(Sqlist &L)
{
/**************线性表初始化********************/
L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(L.elem==NULL)
exit(OVERFLOW);
L.length=0;
L.listsize=LIST_INIT_SIZE;
return OK;
}
/*************************************************/
State DestroyList(Sqlist &L)
{
/**************线性表销毁********************/
if(L.elem==NULL)
return ERROR;
else
free(L.elem);
return OK;
}
/**************************************************/
State ClearList(Sqlist &L)
{
/**************将线性表重置为空表********************/
if(L.elem==NULL)
return ERROR;
int i;
ElemType *p_elem=L.elem;
for(i=0;i<L.length;i++)
{
*L.elem=NULL; //L.elem地址处的元素置空
L.elem++;
}
L.elem=p_elem; //返回初始地址
return OK;
}
/*******************************************************/
State ListEmpty(Sqlist L)
{
/**************判断线性表是否为空********************/
return L.length == 0 ? TURE : FLASE;
}
/***************************************************/
State ListLength(Sqlist L)
{
/**************判断线性表长度********************/
return L.length;
}
/***************************************************/
State GetElem(Sqlist &L,int i)
{
/**************返回线性表第i个值********************/
if(i<1||i>L.length)
exit(OVERFLOW);
return L.elem[i-1];
}
/**********************************************************/
State LocateElem(Sqlist L,ElemType e)
{
/********************返回L中第一个满足e的位置,没有返回0***********************/
int* p=L.elem;
for(int i=1;i<L.length;i++)
{
if(e==*L.elem)
{return i;}
L.elem++;
}
return FLASE;
}
/**************************************************************************/
State PriorElem(Sqlist L,ElemType cur_e)
{
/********************返回L中cur_e的前驱***********************/
int *p=L.elem;
int i;
for(i=1;i<=L.length;i++,p++)
{
if(*p==cur_e)
break;
}
if(i==L.length+1) //线性表中无该元素
return ERROR;
if(i==1) //无前驱
return ERROR;
return L.elem[i-2]; //返回前驱的地址
}
/*************************************************************/
State NextElem(Sqlist L,ElemType cur_e)
{
/********************返回L中cur_e的后继***********************/
int *p=L.elem;
int i;
for(i=1;i<=L.length;i++,p++)
{
if(*p==cur_e)
break;
}
if(i==L.length)
return ERROR; //无后继
if(i==L.length+1)
return ERROR; //线性表中无该元素
return L.elem[i]; //后继
}
/*******************************************************************/
State ListInsert(Sqlist &L,int i,ElemType e)
{
/********************将e插入到第i个元素前***********************/
if(i<1||i>L.length+1) //为什么 长度+1
return OVERFLOW; //插入位置超出线性表的范围
if(L.length>=L.listsize)
{ //线性表已满
int *newbase = (ElemType *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType)); //分配新空间
if( !newbase)
exit(OVERFLOW); //分配失败
L.elem=newbase;
L.listsize+=LISTINCREMENT;
}
/*int *q=&(L.elem[i-1]),*p; // q为插入位置
for (p = &(L.elem[L.length]); p>=q; --p)
*(p+1) = *p; // 插入位置及之后的元素右移
*q = e; // 插入e*/
int j=L.length;
while(j>=i)
{
L.elem[j]=L.elem[j-1]; //把包括第i个元素依次往后移
j--;
}
L.elem[i-1]=e; //插入元素
L.length++; //长度加1
return OK;
}
/*******************************************************************/
State ListDelete(Sqlist &L,int i,ElemType &e)
{
/********************删除第i个元素,并返回其值***********************/
if(i<1||i>L.length)
return OVERFLOW; //i不再线性表内
else if(i==L.length) //若删除最后一个元素,直接置零,长度减1
{
L.elem[i]=0;
L.length--;
}
else
{
while(i<L.length)
{
L.elem[i-1]=L.elem[i]; //依次把第i个元素往前放置
i++;
}
L.length--;
}
return e=L.elem[i-1];
}
/*******************************************************************/
State ListTraverse(Sqlist L)
{
/********************遍历线性表的每一个元素***********************/
int i;
for(i=0;i<L.length;i++)
{
printf("%d ",L.elem[i]);
}
printf("\n");
return OK;
}
/*******************************************************************/
int main()
{
Sqlist L;
L.elem=NULL; //!!!指针要初始化
InitList(L);
int i;
for(i=1;i<=10;i++)
{
ListInsert(L,i,i);
}
ListTraverse(L);
ElemType e=0;
ListDelete(L,5,e);
e = L.elem[3];
ListTraverse(L);
printf("元素 %d 下一个元素是: %d\n",e,NextElem(L,e));
printf("元素 %d 前一个元素是: %d\n",e,PriorElem(L,e));
printf("元素 %d 的位序是: %d\n",e,LocateElem(L,e));
printf("线性表的第 %d 个元素是 : %d\n",9,GetElem(L,9));
printf("当前线性表长度为:%d\n",ListLength(L));
DestroyList(L);
getchar();
return 0;
}