数据结构复习之顺序方式存储的线性表实现

本文详细介绍了一种使用C语言实现顺序表数据结构的方法,包括初始化、销毁、清空、判断空表、获取长度等基本操作,以及元素的查找、插入、删除等功能。通过具体的代码示例,展示了如何在顺序表中进行元素的定位、获取前后元素和遍历访问。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <stdio.h>
#include <stdlib.h>
#include<malloc.h>

//定义各种状态
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define INFEASIBLE -1
#define OVERFLOW -2

//线性表存储空间的初始量和增量
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10

//约定状态和元素类型
typedef int Status;
typedef int ElemType;

//顺序方式存储的结构体
typedef struct {
    ElemType * elem;
    int length;
    int listsize;
}SqList,*SqListPtr;

Status InitList(SqListPtr L);
Status DestroyList(SqListPtr L);
Status ClearList(SqListPtr L);
Status ListEmpty(SqList L);
int ListLength(SqList L);
void GetElem(SqList L,int i,ElemType* e);
Status compare(ElemType e1,ElemType e2);
int LocateElem(SqList L,ElemType e,Status(*compare)(ElemType,ElemType));
Status PriorElem(SqList L,ElemType cur_e,ElemType* pre_e);
Status NextElem(SqList L,ElemType cur_e,ElemType* next_e);
Status ListInsert(SqListPtr L,int i,ElemType e);
Status ListDelete(SqListPtr L,int i,ElemType* e);
Status visit(ElemType e);
Status ListTraverse(SqList L,Status(*visit)(ElemType));

int main()
{
    int i,e;
    SqList slist;
    InitList(&slist);
    for(i=0;i<5;i++){
        slist.elem[i]=i+1;
        slist.length=5;
    }

    //测试区



    for(i=0;i<slist.length;++i){
        printf("%d ",slist.elem[i]);
    }
    printf("\n");
    return 0;
}

Status InitList(SqListPtr L){
    //构造一个空表
    L->elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
    if(!L->elem)
        return OVERFLOW;
    L->length=0;
    L->listsize=LIST_INIT_SIZE;
    return OK;
}//InitList

Status DestroyList(SqListPtr L){
    //销毁线性表
    free(L->elem);
    L->listsize=0;
    L->length=0;
    L->elem=NULL;
    return OK;
}//DestroyList

Status ClearList(SqListPtr L){
    //重置线性表为空表
    if(!(L->elem=(ElemType *)realloc(L->elem,LIST_INIT_SIZE*sizeof(ElemType))))
        return ERROR;
    L->length=0;
    L->listsize=LIST_INIT_SIZE;
    return OK;
}//ClearList

Status ListEmpty(SqList L){
    //判断是否为空表
    if(L.length==0){
        return TRUE;
    }
    return FALSE;
}//ListEmpty

int ListLength(SqList L){
    //返回线性表的长度
    return L.length;
}//ListLength


void GetElem(SqList L,int i,ElemType* e){
    //返回指定位置的元素
    *e = L.elem[i-1];
}//GetElem

Status compare(ElemType e1,ElemType e2){
    if(e1==e2)
        return TRUE;
    else
        return FALSE;
}//compare


int LocateElem(SqList L,ElemType e,Status(*compare)(ElemType,ElemType)){
    int i=1;
    ElemType * p=L.elem;
    while(i<=L.length&&!(*compare)(*p++,e))
        ++i;
    if(i<=L.length)
        return i;
    else
        return 0;
}//LocateElem


Status PriorElem(SqList L,ElemType cur_e,ElemType* pre_e){
    //返回已存在元素的前一个元素
    int i;
    for(i=1;i<L.length;i++){
        if(cur_e==L.elem[i]){
            *pre_e=L.elem[i-1];
            return TRUE;
        }
    }
    *pre_e=NULL;
    return FALSE;
}//PriorElem


Status NextElem(SqList L,ElemType cur_e,ElemType* next_e){
    //返回已存在元素的下一个元素
    int i;
    for(i=0;i<L.length-1;i++){
        if(cur_e==L.elem[i]){
            *next_e=L.elem[i+1];
            return TRUE;
        }
    }
    *next_e=NULL;
    return FALSE;
}//NextElem

Status ListInsert(SqListPtr L,int i,ElemType e){
    //在线性表指定位置插入新的数据元素
    ElemType * p,* q;
    if(i<1||i>L->length+1)
        return ERROR;
    if(L->length>=L->listsize){
        SqListPtr newbase=(ElemType *)realloc(L->elem,(L->listsize+LISTINCREMENT)*sizeof(ElemType));
        if(!newbase)
            return OVERFLOW;
        L->elem=newbase;
        L->listsize+=LISTINCREMENT;
    }
    q=&(L->elem[i-1]);
    for(p=&(L->elem[L->length-1]);p>=q;--p){
        *(p+1)=*p;
    }
    *q=e;
    ++L->length;
    return OK;
}//ListInsert


Status ListDelete(SqListPtr L,int i,ElemType* e){
    //删除指定元素并返回其值
    ElemType *p,*q;
    if(i<1||i>L->length)
        return ERROR;
    p=&(L->elem[i-1]);
    *e=*p;
    q=L->elem+L->length-1;
    p++;
    for(p;p<=q;++p)
        *(p-1)=*p;
    --L->length;
    return OK;
}//ListDelete


Status visit(ElemType e){
    if(e%2==0)
        return TRUE;
    return FALSE;
}//visit


Status ListTraverse(SqList L,Status(*visit)(ElemType)){
    //遍历访问
    int i;
    for(i=0;i<L.length;i++){
        if(!(*visit)(L.elem[i]))
            return FALSE;
    }
    return TRUE;
}//ListTraverse
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值