Tabla de secuencia de tabla lineal (lenguaje C)

Operación de la tabla de secuencia de la tabla lineal

1. Definición de matriz dinámica

/*
    @description: 定义内存动态分配顺序表
 */
typedef struct{
    
    
    ElemType *elem;
    int Length;
    int ListSize;
}SqList;

2. Inicialización

/*
    listSize > 0 : 动态分配内存空间,顺序表长度为listSize
    listSize <= 0 : 顺序表长度默认为DEFAULT_CAPACITY = 10
 */
bool InitList(SqList &L, int listSize)
{
    
    
    if(listSize > 0)
    {
    
    
        L.elem = (ElemType*) malloc( listSize * sizeof(ElemType) );
        if(!L.elem)exit(OVERFLOW);
        L.Length = 0;
        L.ListSize = listSize;
        return success;
    }
    L.elem = (ElemType*) malloc(DEFAULT_CAPACITY * sizeof(ElemType));
    if(!L.elem)exit(OVERFLOW);
    L.Length = 0;
    L.ListSize = DEFAULT_CAPACITY;
    return success;
}

3. Insertar elementos según la posición

/*
    @description: 在顺序表L第index个前插入一个元素e,当顺序表长度不够自动增长
 */
bool ListInsert(SqList &L, int index, ElemType e)
{
    
    
    if( index < 1 || index > L.Length + 1) return failed;
    if(L.Length >= L.ListSize)
    {
    
    
        ElemType* newelem = (ElemType*) realloc( L.elem, (L.ListSize + LISTINCREMENT) * sizeof(ElemType) );
        if(!newelem) return failed;
        L.ListSize += LISTINCREMENT;
        L.elem = newelem;
    }
    for(int i = L.Length - 1; i >= index - 1; i --)
        L.elem[i + 1] = L.elem[i];
    L.elem[index - 1] = e;
    L.Length++;
    return success;
}

4. Elimina el elemento de posición especificado.

/*
    @description: 删除顺序表中第index个元素
 */
bool ListRemove(SqList &L, int index)
{
    
    
    if( index < 1 || index > L.Length ) return failed;
    for(int i = index; i < L.Length; i ++)
        L.elem[i - 1] = L.elem[i];
    L.Length--;
    return success;
}

5. Obtén el elemento de posición especificado

/*
    @description: 按照index(1 ~ ListSize)对顺序表取值到e
 */
bool GetElem(SqList &L, int index, ElemType &e)
{
    
    
    if(index <= 0) return failed;
    e = L.elem[index - 1];
    return success;
}

6. Obtenga la primera posición de ocurrencia del elemento especificado

/*
    @description: 查询顺序表中第一个元素e的位置(1 ~ Length)
    @return: 返回序号,查询不到返回 -1
 */
int LocateElem(SqList &L, ElemType e)
{
    
    
    for(int i = 0; i < L.Length; i++)
    {
    
    
        if(L.elem[i] == e)return i + 1;
    }
    return -1;
}

6. Combinar dos listas ordenadas

/*
    @description: 从小到大合并两个有序顺序表
 */
void MergeList(SqList la, SqList lb, SqList &Lc)
{
    
    
    Lc.Length = la.Length + lb.Length, Lc.ListSize = Lc.Length;
    Lc.elem = (ElemType*) malloc(Lc.ListSize * sizeof(ElemType));
    int i = 0, ia = 0, ib = 0;
    while(ia < la.Length || ib < lb.Length)
    {
    
    
        if(la.elem[ia] <= lb.elem[ib])
        {
    
    
            Lc.elem[i++] = la.elem[ia++];
        }else{
    
    
            Lc.elem[i++] = lb.elem[ib++];
        }
    }
    while(ia < la.Length)
    {
    
    
        Lc.elem[i++] = la.elem[ia++];
    }
    while(ib < lb.Length)
    {
    
    
        Lc.elem[i++] = lb.elem[ib++];
    }
}

Supongo que te gusta

Origin blog.csdn.net/qq_45830383/article/details/114368498
Recomendado
Clasificación