线性表的顺序表示和实现

前言

本文基于严蔚敏老师的《数据结构(C语言版)》(清华大学出版社)一书,将原书中使用C++编写的顺序表基本操作进行了C语言版本的重写,在CodeBlocks的C语言运行环境下测试无错误。

预定义常量和类型、结构体定义、函数声明

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stdbool.h>
//预定义常量
#define TRUE        1
#define FALSE       0
#define OK          1
#define ERROR       0
#define INFEASIBLE  -1
#define OVERFLOW    -2
//预定义类型
typedef int Status;
typedef int ElemType;

/*---线性表的动态分配顺序存储结构定义---*/
#define LIST_INIT_SIZE  100                     //线性表存储空间的初始分配量
#define LISTINCREMENT   10                      //线性表存储空间的分配增量
typedef struct
{
	ElemType *elem;                 //存储空间基地址
	int     length;                 //当前长度
	int     listsize;               //当前分配的存储容量(以sizeof(ElemType)为单位)
}SqList;

/*全局变量定义*/
ElemType *p,*q;
//函数声明
Status InitList_Sq(SqList** L);                             //构造一个空的线性表L
Status DestroyList_Sq(SqList** L);                          //销毁线性表L
Status ClearList_Sq(SqList** L);                            //将线性表L重置为空表
Status ListEmpty_Sq(SqList L);                              //判定L是否为空表,是返回TRUE,否则返回FALSE
Status ListLength_Sq(SqList L);                             //求L的长度,返回L中数据元素个数
Status GetElem_Sq(SqList L, int i, ElemType *e);            //用e返回L中第i个数据元素的值
Status LocateElem_Sq(SqList L, ElemType e, Status (*compare)(ElemType x, ElemType y));         //在顺序表L中查找第1个与e满足关系compare()的数据元素的位序
//3个compare函数
Status greater(ElemType x, ElemType y);
Status equal(ElemType x, ElemType y);
Status less(ElemType x, ElemType y);
Status PriorElem_Sq(SqList L, ElemType cur_e, ElemType *pre_e);                                 //寻找cur_e的直接前驱
Status NextElem_Sq(SqList L, ElemType cur_e, ElemType *next_e);                                 //寻找cur_e的直接后继
Status ListInsert_Sq(SqList** L, int i, ElemType e);                                            //在顺序表中第i个位置之前插入新的数据元素e
Status ListDelete_Sq(SqList** L, int i, ElemType *e);                                           //删除顺序表的第i个数据元素,并用e返回其值
Status ListTraverse_Sq(SqList** L, Status (*visit)(ElemType e));                                //依次对L的每个数据元素调用函数visit(),一旦vixit()失败,则操作失败
//visit函数
Status Print(ElemType e);

测试主函数

int main()
{
    int i,j=10,k=18;
    ElemType e,pre_e,next_e;
    SqList Sq;          //创建结构体变量Sq
    SqList *L = &Sq;    //创建结构体指针L
    if(InitList_Sq(&L))
        printf("顺序表构造成功!\n");
    printf("该顺序表的长度为%d\n",ListLength_Sq(Sq));
    if(ListEmpty_Sq(Sq))
        printf("······\n该顺序表为空表!\n");
    else
        printf("······\n该顺序表不是空表!\n");
    for(i=0;i<L->listsize;i++)
    {
        L->elem[i] = i+1;
        L->length++;
    }
    printf("赋值成功!\n");
    if(ListEmpty_Sq(Sq))
        printf("······\n该顺序表为空表!\n");
    else
        printf("······\n该顺序表不是空表!\n");
    printf("该顺序表的长度为%d\n",ListLength_Sq(Sq));
    GetElem_Sq(Sq,j,&e);
    printf("顺序表中第%d个数据元素的值为%d\n",j,e);
    printf("第一个大于e的元素的位序为%d\n",LocateElem_Sq(Sq,e,greater));
    printf("第一个等于e的元素的位序为%d\n",LocateElem_Sq(Sq,e,equal));
    printf("第一个小于e的元素的位序为%d\n",LocateElem_Sq(Sq,e,less));
    if(ClearList_Sq(&L))
        printf("顺序表重置成功!\n");
    printf("该顺序表的长度为%d\n",ListLength_Sq(Sq));
    if(ListEmpty_Sq(Sq))
        printf("······\n该顺序表为空表!\n");
    else
        printf("······\n该顺序表不是空表!\n");
    for(i=0;i<L->listsize;i++)
    {
        L->elem[i] = i+1;
        L->length++;
    }
    printf("赋值成功!\n");
    if(ListEmpty_Sq(Sq))
        printf("······\n该顺序表为空表!\n");
    else
        printf("······\n该顺序表不是空表!\n");
    printf("该顺序表的长度为%d\n",ListLength_Sq(Sq));
    PriorElem_Sq(Sq,k,&pre_e);
    printf("%d的直接前驱为%d\n",k,pre_e);
    NextElem_Sq(Sq,k,&next_e);
    printf("%d的直接后继为%d\n",k,next_e);
    printf("在顺序表中第%d个位置之前插入新的数据元素%d\n",k,e);
    ListInsert_Sq(&L,k,e);
    printf("修改后的顺序表为:\n");
    for(i=0;i<L->length;i++)
    {
        printf("%d\t",L->elem[i]);
    }
    printf("\n删除顺序表的第%d个数据元素\n",k);
    ListDelete_Sq(&L,k,&e);
    printf("被删除的元素为%d\n",e);
    printf("修改后的顺序表为:\n");
    for(i=0;i<L->length;i++)
    {
        printf("%d\t",L->elem[i]);
    }
    printf("\n依次对顺序表的每个数据元素调用函数Print(),做输出操作:\n");
    ListTraverse_Sq(&L,Print);
    printf("\n操作完成,对顺序表进行销毁。\n");
    if(DestroyList_Sq(&L))
        printf("顺序表销毁成功!\n");
    return 0;
}

各基本操作的功能实现

//函数功能:构造一个空的线性表L
//函数参数:结构体指针L
//返回值:成功返回OK,失败返回OVERFLOW
Status InitList_Sq(SqList** L)
{
    (*L)->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));
    if(!(*L)->elem)     exit(OVERFLOW);         //存储分配失败
    (*L)->length = 0;                           //空表长度为0
    (*L)->listsize = LIST_INIT_SIZE;            //初始存储容量
    return OK;
}
//函数功能:销毁线性表L
//函数参数:二级结构体指针L
//返回值:成功返回OK,失败返回ERROR
Status DestroyList_Sq(SqList** L)
{
    free((*L)->elem);
    (*L)->elem = NULL;
    (*L)->length = 0;
    (*L)->listsize = 0;
    if(!(*L)->elem)
        return OK;
    else
        return ERROR;
}
//函数功能:将线性表L重置为空表
//函数参数:二级结构体指针L
//返回值:成功返回OK
Status ClearList_Sq(SqList** L)
{
    (*L)->length = 0;
    return OK;
}
//函数功能:判定L是否为空表
//函数参数:顺序表L
//返回值:是返回TRUE,否返回FALSE
Status ListEmpty_Sq(SqList L)
{
    if(L.length == 0)   return TRUE;
    else    return FALSE;
}
//函数功能:求L的长度
//函数参数:顺序表L
//返回值:返回L中数据元素个数
Status ListLength_Sq(SqList L)
{
    return L.length;
}
//函数功能:用e返回L中第i个数据元素的值
//函数参数:顺序表L,整型变量i,ElemType类型指针e
//返回值:L中第i个元素的值
Status GetElem_Sq(SqList L, int i, ElemType *e)
{
    *e = L.elem[i-1];
    return OK;
}
//函数功能:在顺序表L中查找第1个与e满足关系compare()的数据元素的位序
//函数参数:结构体变量L,ElemType类型变量e,函数指针compare
//返回值:成功返回相应位序,失败返回0
Status LocateElem_Sq(SqList L, ElemType e, Status (*compare)(ElemType x, ElemType y))
{
    int i=1;                        //i的初值为第一个元素的位序
    p = L.elem;                     //p的初值为第一个元素的存储位置
    while(i<=L.length && !(*compare)(*p++,e))    ++i;
    if(i<= L.length)    return i;
    else    return 0;
}
Status greater(ElemType x, ElemType y)      //寻找第一个大于e的元素
{
    if(x > y) return TRUE;
    else    return FALSE;
}
Status equal(ElemType x, ElemType y)        //寻找第一个等于e的元素
{
    if(x == y) return TRUE;
    else    return FALSE;
}
Status less(ElemType x, ElemType y)         //寻找第一个小于e的元素
{
    if(x < y) return TRUE;
    else    return FALSE;
}
//函数功能:若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的直接前驱,否则操作失败,pre_e无定义
//函数参数:结构体变量L,ElemType类型变量cur_e,ElemType类型指针pre_e
//返回值:成功返回OK,失败返回ERROR
Status PriorElem_Sq(SqList L, ElemType cur_e, ElemType *pre_e)
{
    int i;
    for(i = 0;i < L.length;i++)
    {
        if(L.elem[i] == cur_e)
        {
            break;
        }
    }
    if (i == 0 || i == L.length)
    {
        if(i == 0)
        {
            printf("该元素没有前驱捏\n");
        }
        else
        {
            printf("该元素不是L的数据元素捏\n");
        }
        return ERROR;
    }
    *pre_e = L.elem[i - 1];
    return OK;
}
//函数功能:若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的直接后继,否则操作失败,next_e无定义
//函数参数:结构体变量L,ElemType类型变量cur_e,ElemType类型指针next_e
//返回值:成功返回OK,失败返回ERROR
Status NextElem_Sq(SqList L, ElemType cur_e, ElemType *next_e)
{
    int i;
    for(i = 0;i < L.length;i++)
    {
        if(L.elem[i] == cur_e)
        {
            break;
        }
    }
    if (i == L.length-1 || i == L.length)
    {
        if(i == L.length-1)
        {
            printf("该元素没有直接后驱捏\n");
        }
        else
        {
            printf("该元素不是L的数据元素捏\n");
        }
        return ERROR;
    }
    *next_e = L.elem[i + 1];
    return OK;
}
//函数功能:在顺序表中第i个位置之前插入新的数据元素e
//函数参数:二级结构体指针L,整型变量i,ElemType变量e
//返回值:成功返回OK,失败返回ERROR或OVERFLOW
Status ListInsert_Sq(SqList** L, int i, ElemType e)
{
    if(i<1 || i>(*L)->length+1)     return ERROR;               //i值不合法,i的合法值为1<= i <=ListLength_Sq(L)+1
    if((*L)->length >= (*L)->listsize)                              //当前存储空间已满,增加分配
    {
        (*L)->elem = (ElemType *)realloc((*L)->elem, ((*L)->listsize + LISTINCREMENT) * sizeof(ElemType));          //新基地址
        if(!(*L)->elem)     exit(OVERFLOW);                     //存储分配失败
        (*L)->listsize += LISTINCREMENT;                        //增加存储容量
    }
    q = &((*L)->elem[i-1]);                                     //用指针q记录插入位置的地址
    for(p = &((*L)->elem[(*L)->length-1]);p>=q;--p)     *(p+1) = *p;                //插入位置及之后的元素右移
    *q = e;                                                 //插入e
    ++(*L)->length;                                             //线性表长度增加1
    return OK;
}
//函数功能:删除顺序表的第i个数据元素,并用e返回其值
//函数参数:二级结构体指针L,整型变量i,ElemType类型变量e
//返回值:成功返回OK,失败返回ERROR
Status ListDelete_Sq(SqList** L, int i, ElemType *e)
{
    if(i<1 || i>(*L)->length+1)     return ERROR;               //i值不合法
    p = &((*L)->elem[i-1]);                                      //p为被删除元素的位置
    *e = *p;                                                     //被删除元素的值赋给e
    q = (*L)->elem+(*L)->length-1;                              //表尾元素的位置
    for(++p;p<=q;++p)   *(p-1) = *p;                            //被删除元素之后的元素左移
    --(*L)->length;                                             //表长减1
    return OK;
}
//函数功能:依次对L的每个数据元素调用函数visit(),一旦vixit()失败,则操作失败
//函数参数:二级结构体指针L,Status类型函数指针visit
//返回值:成功返回OK
Status ListTraverse_Sq(SqList** L, Status (*visit)(ElemType e))
{
    int i;
    for(i=0;i<(*L)->length;i++)
    {
        (*visit)((*L)->elem[i]);
    }
    return OK;
}

Status Print(ElemType e)
{
    printf("%d\t",e);
    return OK;
}

完整代码

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stdbool.h>
//预定义常量
#define TRUE        1
#define FALSE       0
#define OK          1
#define ERROR       0
#define INFEASIBLE  -1
#define OVERFLOW    -2
//预定义类型
typedef int Status;
typedef int ElemType;

/*---线性表的动态分配顺序存储结构定义---*/
#define LIST_INIT_SIZE  100                     //线性表存储空间的初始分配量
#define LISTINCREMENT   10                      //线性表存储空间的分配增量
typedef struct
{
	ElemType *elem;                 //存储空间基地址
	int     length;                 //当前长度
	int     listsize;               //当前分配的存储容量(以sizeof(ElemType)为单位)
}SqList;

/*全局变量定义*/
ElemType *p,*q;
//函数声明
Status InitList_Sq(SqList** L);                             //构造一个空的线性表L
Status DestroyList_Sq(SqList** L);                          //销毁线性表L
Status ClearList_Sq(SqList** L);                            //将线性表L重置为空表
Status ListEmpty_Sq(SqList L);                              //判定L是否为空表,是返回TRUE,否则返回FALSE
Status ListLength_Sq(SqList L);                             //求L的长度,返回L中数据元素个数
Status GetElem_Sq(SqList L, int i, ElemType *e);            //用e返回L中第i个数据元素的值
Status LocateElem_Sq(SqList L, ElemType e, Status (*compare)(ElemType x, ElemType y));         //在顺序表L中查找第1个与e满足关系compare()的数据元素的位序
//3个compare函数
Status greater(ElemType x, ElemType y);
Status equal(ElemType x, ElemType y);
Status less(ElemType x, ElemType y);
Status PriorElem_Sq(SqList L, ElemType cur_e, ElemType *pre_e);                                 //寻找cur_e的直接前驱
Status NextElem_Sq(SqList L, ElemType cur_e, ElemType *next_e);                                 //寻找cur_e的直接后继
Status ListInsert_Sq(SqList** L, int i, ElemType e);                                            //在顺序表中第i个位置之前插入新的数据元素e
Status ListDelete_Sq(SqList** L, int i, ElemType *e);                                           //删除顺序表的第i个数据元素,并用e返回其值
Status ListTraverse_Sq(SqList** L, Status (*visit)(ElemType e));                                //依次对L的每个数据元素调用函数visit(),一旦vixit()失败,则操作失败
//visit函数
Status Print(ElemType e);

int main()
{
    int i,j=10,k=18;
    ElemType e,pre_e,next_e;
    SqList Sq;          //创建结构体变量Sq
    SqList *L = &Sq;    //创建结构体指针L
    if(InitList_Sq(&L))
        printf("顺序表构造成功!\n");
    printf("该顺序表的长度为%d\n",ListLength_Sq(Sq));
    if(ListEmpty_Sq(Sq))
        printf("······\n该顺序表为空表!\n");
    else
        printf("······\n该顺序表不是空表!\n");
    for(i=0;i<L->listsize;i++)
    {
        L->elem[i] = i+1;
        L->length++;
    }
    printf("赋值成功!\n");
    if(ListEmpty_Sq(Sq))
        printf("······\n该顺序表为空表!\n");
    else
        printf("······\n该顺序表不是空表!\n");
    printf("该顺序表的长度为%d\n",ListLength_Sq(Sq));
    GetElem_Sq(Sq,j,&e);
    printf("顺序表中第%d个数据元素的值为%d\n",j,e);
    printf("第一个大于e的元素的位序为%d\n",LocateElem_Sq(Sq,e,greater));
    printf("第一个等于e的元素的位序为%d\n",LocateElem_Sq(Sq,e,equal));
    printf("第一个小于e的元素的位序为%d\n",LocateElem_Sq(Sq,e,less));
    if(ClearList_Sq(&L))
        printf("顺序表重置成功!\n");
    printf("该顺序表的长度为%d\n",ListLength_Sq(Sq));
    if(ListEmpty_Sq(Sq))
        printf("······\n该顺序表为空表!\n");
    else
        printf("······\n该顺序表不是空表!\n");
    for(i=0;i<L->listsize;i++)
    {
        L->elem[i] = i+1;
        L->length++;
    }
    printf("赋值成功!\n");
    if(ListEmpty_Sq(Sq))
        printf("······\n该顺序表为空表!\n");
    else
        printf("······\n该顺序表不是空表!\n");
    printf("该顺序表的长度为%d\n",ListLength_Sq(Sq));
    PriorElem_Sq(Sq,k,&pre_e);
    printf("%d的直接前驱为%d\n",k,pre_e);
    NextElem_Sq(Sq,k,&next_e);
    printf("%d的直接后继为%d\n",k,next_e);
    printf("在顺序表中第%d个位置之前插入新的数据元素%d\n",k,e);
    ListInsert_Sq(&L,k,e);
    printf("修改后的顺序表为:\n");
    for(i=0;i<L->length;i++)
    {
        printf("%d\t",L->elem[i]);
    }
    printf("\n删除顺序表的第%d个数据元素\n",k);
    ListDelete_Sq(&L,k,&e);
    printf("被删除的元素为%d\n",e);
    printf("修改后的顺序表为:\n");
    for(i=0;i<L->length;i++)
    {
        printf("%d\t",L->elem[i]);
    }
    printf("\n依次对顺序表的每个数据元素调用函数Print(),做输出操作:\n");
    ListTraverse_Sq(&L,Print);
    printf("\n操作完成,对顺序表进行销毁。\n");
    if(DestroyList_Sq(&L))
        printf("顺序表销毁成功!\n");
    return 0;
}
//函数功能:构造一个空的线性表L
//函数参数:结构体指针L
//返回值:成功返回OK,失败返回OVERFLOW
Status InitList_Sq(SqList** L)
{
    (*L)->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));
    if(!(*L)->elem)     exit(OVERFLOW);         //存储分配失败
    (*L)->length = 0;                           //空表长度为0
    (*L)->listsize = LIST_INIT_SIZE;            //初始存储容量
    return OK;
}
//函数功能:销毁线性表L
//函数参数:二级结构体指针L
//返回值:成功返回OK,失败返回ERROR
Status DestroyList_Sq(SqList** L)
{
    free((*L)->elem);
    (*L)->elem = NULL;
    (*L)->length = 0;
    (*L)->listsize = 0;
    if(!(*L)->elem)
        return OK;
    else
        return ERROR;
}
//函数功能:将线性表L重置为空表
//函数参数:二级结构体指针L
//返回值:成功返回OK
Status ClearList_Sq(SqList** L)
{
    (*L)->length = 0;
    return OK;
}
//函数功能:判定L是否为空表
//函数参数:顺序表L
//返回值:是返回TRUE,否返回FALSE
Status ListEmpty_Sq(SqList L)
{
    if(L.length == 0)   return TRUE;
    else    return FALSE;
}
//函数功能:求L的长度
//函数参数:顺序表L
//返回值:返回L中数据元素个数
Status ListLength_Sq(SqList L)
{
    return L.length;
}
//函数功能:用e返回L中第i个数据元素的值
//函数参数:顺序表L,整型变量i,ElemType类型指针e
//返回值:L中第i个元素的值
Status GetElem_Sq(SqList L, int i, ElemType *e)
{
    *e = L.elem[i-1];
    return OK;
}
//函数功能:在顺序表L中查找第1个与e满足关系compare()的数据元素的位序
//函数参数:结构体变量L,ElemType类型变量e,函数指针compare
//返回值:成功返回相应位序,失败返回0
Status LocateElem_Sq(SqList L, ElemType e, Status (*compare)(ElemType x, ElemType y))
{
    int i=1;                        //i的初值为第一个元素的位序
    p = L.elem;                     //p的初值为第一个元素的存储位置
    while(i<=L.length && !(*compare)(*p++,e))    ++i;
    if(i<= L.length)    return i;
    else    return 0;
}
Status greater(ElemType x, ElemType y)      //寻找第一个大于e的元素
{
    if(x > y) return TRUE;
    else    return FALSE;
}
Status equal(ElemType x, ElemType y)        //寻找第一个等于e的元素
{
    if(x == y) return TRUE;
    else    return FALSE;
}
Status less(ElemType x, ElemType y)         //寻找第一个小于e的元素
{
    if(x < y) return TRUE;
    else    return FALSE;
}
//函数功能:若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的直接前驱,否则操作失败,pre_e无定义
//函数参数:结构体变量L,ElemType类型变量cur_e,ElemType类型指针pre_e
//返回值:成功返回OK,失败返回ERROR
Status PriorElem_Sq(SqList L, ElemType cur_e, ElemType *pre_e)
{
    int i;
    for(i = 0;i < L.length;i++)
    {
        if(L.elem[i] == cur_e)
        {
            break;
        }
    }
    if (i == 0 || i == L.length)
    {
        if(i == 0)
        {
            printf("该元素没有前驱捏\n");
        }
        else
        {
            printf("该元素不是L的数据元素捏\n");
        }
        return ERROR;
    }
    *pre_e = L.elem[i - 1];
    return OK;
}
//函数功能:若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的直接后继,否则操作失败,next_e无定义
//函数参数:结构体变量L,ElemType类型变量cur_e,ElemType类型指针next_e
//返回值:成功返回OK,失败返回ERROR
Status NextElem_Sq(SqList L, ElemType cur_e, ElemType *next_e)
{
    int i;
    for(i = 0;i < L.length;i++)
    {
        if(L.elem[i] == cur_e)
        {
            break;
        }
    }
    if (i == L.length-1 || i == L.length)
    {
        if(i == L.length-1)
        {
            printf("该元素没有直接后驱捏\n");
        }
        else
        {
            printf("该元素不是L的数据元素捏\n");
        }
        return ERROR;
    }
    *next_e = L.elem[i + 1];
    return OK;
}
//函数功能:在顺序表中第i个位置之前插入新的数据元素e
//函数参数:二级结构体指针L,整型变量i,ElemType变量e
//返回值:成功返回OK,失败返回ERROR或OVERFLOW
Status ListInsert_Sq(SqList** L, int i, ElemType e)
{
    if(i<1 || i>(*L)->length+1)     return ERROR;               //i值不合法,i的合法值为1<= i <=ListLength_Sq(L)+1
    if((*L)->length >= (*L)->listsize)                              //当前存储空间已满,增加分配
    {
        (*L)->elem = (ElemType *)realloc((*L)->elem, ((*L)->listsize + LISTINCREMENT) * sizeof(ElemType));          //新基地址
        if(!(*L)->elem)     exit(OVERFLOW);                     //存储分配失败
        (*L)->listsize += LISTINCREMENT;                        //增加存储容量
    }
    q = &((*L)->elem[i-1]);                                     //用指针q记录插入位置的地址
    for(p = &((*L)->elem[(*L)->length-1]);p>=q;--p)     *(p+1) = *p;                //插入位置及之后的元素右移
    *q = e;                                                 //插入e
    ++(*L)->length;                                             //线性表长度增加1
    return OK;
}
//函数功能:删除顺序表的第i个数据元素,并用e返回其值
//函数参数:二级结构体指针L,整型变量i,ElemType类型变量e
//返回值:成功返回OK,失败返回ERROR
Status ListDelete_Sq(SqList** L, int i, ElemType *e)
{
    if(i<1 || i>(*L)->length+1)     return ERROR;               //i值不合法
    p = &((*L)->elem[i-1]);                                      //p为被删除元素的位置
    *e = *p;                                                     //被删除元素的值赋给e
    q = (*L)->elem+(*L)->length-1;                              //表尾元素的位置
    for(++p;p<=q;++p)   *(p-1) = *p;                            //被删除元素之后的元素左移
    --(*L)->length;                                             //表长减1
    return OK;
}
//函数功能:依次对L的每个数据元素调用函数visit(),一旦vixit()失败,则操作失败
//函数参数:二级结构体指针L,Status类型函数指针visit
//返回值:成功返回OK
Status ListTraverse_Sq(SqList** L, Status (*visit)(ElemType e))
{
    int i;
    for(i=0;i<(*L)->length;i++)
    {
        (*visit)((*L)->elem[i]);
    }
    return OK;
}

Status Print(ElemType e)
{
    printf("%d\t",e);
    return OK;
}

测试结果

顺序表构造成功!
该顺序表的长度为0
······
该顺序表为空表!
赋值成功!
······
该顺序表不是空表!
该顺序表的长度为100
顺序表中第10个数据元素的值为10
第一个大于e的元素的位序为11
第一个等于e的元素的位序为10
第一个小于e的元素的位序为1
顺序表重置成功!
该顺序表的长度为0
······
该顺序表为空表!
赋值成功!
······
该顺序表不是空表!
该顺序表的长度为100
18的直接前驱为17
18的直接后继为19
在顺序表中第18个位置之前插入新的数据元素10
修改后的顺序表为:
1       2       3       4       5       6       7       8       9       10      11      12      13      14      15
        16      17      10      18      19      20      21      22      23      24      25      26      27      28
        29      30      31      32      33      34      35      36      37      38      39      40      41      42
        43      44      45      46      47      48      49      50      51      52      53      54      55      56
        57      58      59      60      61      62      63      64      65      66      67      68      69      70
        71      72      73      74      75      76      77      78      79      80      81      82      83      84
        85      86      87      88      89      90      91      92      93      94      95      96      97      98
        99      100
删除顺序表的第18个数据元素
被删除的元素为10
修改后的顺序表为:
1       2       3       4       5       6       7       8       9       10      11      12      13      14      15
        16      17      18      19      20      21      22      23      24      25      26      27      28      29
        30      31      32      33      34      35      36      37      38      39      40      41      42      43
        44      45      46      47      48      49      50      51      52      53      54      55      56      57
        58      59      60      61      62      63      64      65      66      67      68      69      70      71
        72      73      74      75      76      77      78      79      80      81      82      83      84      85
        86      87      88      89      90      91      92      93      94      95      96      97      98      99
        100
依次对顺序表的每个数据元素调用函数Print(),做输出操作:
1       2       3       4       5       6       7       8       9       10      11      12      13      14      15
        16      17      18      19      20      21      22      23      24      25      26      27      28      29
        30      31      32      33      34      35      36      37      38      39      40      41      42      43
        44      45      46      47      48      49      50      51      52      53      54      55      56      57
        58      59      60      61      62      63      64      65      66      67      68      69      70      71
        72      73      74      75      76      77      78      79      80      81      82      83      84      85
        86      87      88      89      90      91      92      93      94      95      96      97      98      99
        100
操作完成,对顺序表进行销毁。
顺序表销毁成功!
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值