List-顺序表(有序列表)

源自《大话数据结构》原书代码,未完待续

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

//类型定义
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 20
typedef int ElemType;
typedef int Status;

typedef struct {
    ElemType data[MAXSIZE];
    int length;
}SqList;

//遍历顺序表
Status ListShow(SqList L){
    int i;
    for(i=0; i<L.length; i++) {
        printf("%d ", L.data[i]);
    }
    printf("\n");
    return OK;
}

//初始化顺序表
Status ListInit(SqList *L) {
    L->length = 0;
    return OK;
}

//顺序表L在i位置插入元素e
Status ListInsert(SqList *L, int i, ElemType e) {
    int k;
    //列表是否已满
    if(L->length == MAXSIZE) {
        return ERROR;
    }
    //顺序表不允许相隔插入
    if(i<0 || i>L->length+1){
        return ERROR;
    }

    //如果插入数据不在表尾加1
    if(i<=L->length) {
        for (k = L->length-1; k >= i-1; k--) {
            L->data[k+1] = L->data[k];
        }
    }


    //把新元素插入i位置
    L->data[i-1] = e;

    //表长加1
    L->length++;

    return OK;
}

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

//查看第i个元素的内容
Status GetElem(SqList L, int i, ElemType *e) {
    if(i<0 || i>L.length)
        return ERROR;
    *e = L.data[i-1];

    return OK;
}

//删除顺序表中某个元素
Status ListDelete(SqList *L, int i, ElemType *e) {
    int k;
    if(L->length==0)
        return ERROR;
    if(i<0 || i>L->length)
        return ERROR;
    *e = L->data[i-1];
    if(i<L->length) {
        for(k=i; k<L->length; k++)
            L->data[k-1] = L->data[k];
    }
    L->length--;

    return OK;
}

//顺序表长度
int ListLength(SqList L) {
    return L.length;
}

//查找一个元素在顺序表里的序号
Status LocateElem(SqList L, int search, int *e){
    int k;
    if(L.length==0)
        return ERROR;
    for(k=0; k<L.length-1; k++) {
        if(L.data[k]==search)
            break;
    }
    *e = k+1;

    return OK;
}

int main(void) {
    SqList L;
    int i;

    //顺序表初始化
    i = ListInit(&L);
    printf("ListInit result is:%d(1:success, 0:fail)\n", i);

    //在表头插入10个元素
    for(i=10; i>0; i--)
        ListInsert(&L, 1, i);

    //表尾插入
    ListInsert(&L, 1, 0);

    //显示整个顺序表
    ListShow(L);

    //查看第二个元素是什么
    GetElem(L, 2, &i);
    printf("第2个元素内容是:%d \n", i);

    //判断元素是否在顺序表里,如果在返回序号,否则返回0
    LocateElem(L, 4, &i);
    printf("4在顺序表里的序号是:%d \n", i);

    //删除第五个元素
    GetElem(L, 5, &i);
    printf("第五个元素是:%d \n", i);
    ListDelete(&L, 5, &i);
    printf("删除第五个元素后 \n");
    ListShow(L);


    return 0;
}

  1. 迷惑过,为什么清空一个顺序表直接length=0,后经人指点 有序列表下次insert操作时候会把数据修改后length++,虽然会有部分老数据没修改,但是正常访问顺序表根本不会访问到那些旧数据

    原文作者:云南厨子
    原文地址: https://www.jianshu.com/p/a6fba1ba1b74
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞