顺序表及基本操作(C语言)


#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;
};

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM