#include
#include
//基本操作函数用到的状态码
#define TRUE 1;
#define FALSE 0;
#define OK 1;
#define ERROR 0;
#define INFEASIBLE -1; //当不可行时
const int OVERFLOW = -2; //当溢出时
//表中数据元素的最大数量
const int MaxSize = 1000;
//Status是新定义的一种函数返回值类型,其值为int型,意义为函数运行结果 状态码
typedef int Status;
//定义一种 数据元素 类型
typedef char ElemType;
//顺序表定义
typedef struct {
ElemType *elem;
int length;
} SqList;
//基本操作1:线性表初始化
Status InitList(SqList *list) { //构造一个空的顺序表
list->elem=(ElemType*)malloc(sizeof(ElemType)*MaxSize); //为顺序表分配空间
if(!list->elem) { //存储分配失败
return OVERFLOW;
};
list->length=0; //空表长度为0
return OK; //返回状态
};
//基本操作2:线性表销毁
Status DestroyList(SqList *list) {
if(list->elem){ //线性表存在
free(list->elem); //free(p),p是指针或地址
//free((*list).elem); //也一样
};
return OK;
};
//基本操作3:线性表清空
Status ClearList(SqList *list) {
if(list->length!=0){ //线性表存在
list->length=0;
return OK;
};
};
//基本操作4:求线性表长
int GetLength(SqList list) {
if(list.elem){ //线性表存在
return list.length;
};
}
//基本操作5:判断线性表是否为空
int IsEmpty(SqList list) {
if(list.elem){ //线性表存在
if(list.length==0){
return TRUE;
} else {
return FALSE;
}
}
}
//基本操作6:根据结点索引i获取相应位置元素的内容
Status GetElem(SqList list,int i,ElemType *elem) {
if(i<1||i>list.length) { //判断i值是否合理
return ERROR;
} else { // 将中间结点值替换为目标结点的值
*elem=list.elem[i-1];
return OK;
}
}
//基本操作7:查找与目标元素值相同的元素结点,返回逻辑下标 ,若不存在,返回0
int LocateElem(SqList list,ElemType elem){
int i;
for(i=0;i<list.length;i++){
if(list.elem[i]==elem) return i+1;
}
return 0;
}
//基本操作8:插入结点元素到指定位置。(i为逻辑位置)
Status ListInsert(SqList* list,int i,ElemType elem){
if(i<1||i>list->length+1) return ERROR;
if(list->length==MaxSize) return OVERFLOW;
int j;
for(j=list->length-1;j>=i-1;j--){
list->elem[j+1]=list->elem[j];
}
list->elem[i-1]=elem;
list->length++;
return OK;
}
//基本操作9:顺序表的结点删除,被删除的结点值保存在参数elem
Status ListDelete(SqList* list,int i,ElemType* elem){
if(i<1||i>list->length) return ERROR;
int j;
*elem=list->elem[i-1];
for(j=i;j<=list->length-1;j++){
list->elem[j-1]=list->elem[j];
}
list->length--;
return OK;
}
//基本操作10:顺序表元素遍历输出
Status ListTraverse(SqList list){
int j;
printf("逻辑序号:\t元素值:\n");
for(j=0;j<list.length;j++){
printf(" %d\t\t %c\n",j+1,list.elem[j]);
}
return OK;
}//PriorElem(list,cur_e,&pre_e);
//NextElem(list,cur_e,&next_e);
int main(void){
//定义一个线性表
SqList list1;
//初始化线性表
Status initResultCode = InitList(&list1);
//赋值
ElemType elem1,elem2,elem3;
elem1='Y';
elem2='C';
elem3='L';
list1.elem[0]=elem1;
list1.elem[1]=elem2;
list1.elem[2]=elem3;
list1.length=3;
//printf("初始化结果状态码为:%d\n",initResultCode); //1
//清空
/\*
printf("清空前线性表长:%d\\n",GetLength(list1));
Status clearResultCode = ClearList(&list1);
printf("清空后线性表长:%d\\n",GetLength(list1));
printf("清空结果状态码为%d\\n",clearResultCode); //1
\*/
//销毁 free()配合malloc()
/\*
printf("线性表释放前,首结点值:%c\\n",list1.elem\[0\]); //Y
Status destroyResultCode = DestroyList(&list1);
printf("线性表释放后,首结点值:%c\\n",list1.elem\[0\]); //?
printf("销毁结果状态码为%d\\n",destroyResultCode); //1
\*/
//为空?
/\*
int isNull = IsEmpty(list1);
printf("为空?%d\\n",isNull);
\*/
//遍历
/\*
ListTraverse(list1);
\*/
//用 中间元素elemx 保存索引到的元素的值
/\*
ElemType elemx='L';
Status getElemResult = GetElem(list1,2,&elemx);
printf("\\n得到元素?:%d\\n",getElemResult);
printf("list1表中 'elem(2)' 中的值:%c\\n",elemx);
\*/
//查找表中与目标元素值相同的元素的 逻辑位置(第几个)
/\*
ElemType elemTargetValue='L'; //目标元素
int resultIndex=LocateElem(list1,elemTargetValue);
printf("目标元素逻辑位置为:%d\\n",resultIndex);
\*/
//插入
/\*
ElemType elemReadyInserted='T';
Status insertResultCode=ListInsert(&list1,1,elemReadyInserted);
printf("插入后表长:%d\\n",list1.length);
printf("1号元素值:%c\\n",list1.elem\[0\]);
printf("插入结果状态码:%d\\n",insertResultCode);
\*/
//删除元素结点
/\*
ElemType deletedElem; //保存被删除的结点值
Status deleteResultCode=ListDelete(&list1,1,&deletedElem);
printf("删除结果状态码:%d\\n",deleteResultCode);
printf("表长:%d\\n",list1.length);
printf("现在的1号结点值:%c\\n",list1.elem\[0\]);
printf("被删除的结点值:%c\\n\\n",deletedElem);
\*/
return 0;
};
手机扫一扫
移动阅读更方便
你可能感兴趣的文章