#include <stdio.h> #include <stdlib.h> //基本操作函数用到的状态码 #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; };