C数组实现表,代码函数及主函数调用

C数组实现表,代码函数及主函数调用

重点:位置和索引不用,位置比索引值多1;例如,表位置1 => 表的索引0;或者可以理解为位置是常人思维,索引是程序员思维;

#include <stdio.h>
#include <stdlib.h>       // malloc
typedef int ListItem;     // 表元素类型
typedef ListItem *addr;   // 表元素指针类型
#define eq(A, B) (A == B) // 元素相等

typedef struct alist *List; // 单链表指针类型
typedef struct alist
{
    
    
    int n, curr;     // 表长 ,当前位置
    int maxsize;     // 数组上届
    ListItem *table; // 记录表中元素的数组
} Alist;

List ListInit(int size);                    // 表结构初始化,返回一个结构体指针
int ListEmpty(List L);                      // 测试表是否为空
int ListLength(List L);                     // 表L的长度
ListItem ListRetrieve(int k, List L);       // 返回表L位置k的元素
int ListLocate(ListItem x, List L);         // 元素x在表L的位置
void ListInsert(int k, ListItem x, List L); // 在表L索引k的位置插入元素x
ListItem ListDelete(int k, List L);         //从表L中删除位置k的元素
void PrintList(List L);                     // 按照位置次序输出表L中的元素
void ItemShow(ListItem x);                  // 输出表元素
void ListFree(List L);                      // 使用结束后释放动态分配的数组空间

int main(int argc, char const *argv[])
{
    
    
    List L = ListInit(6); // 初始化大小为6的表
    if (ListEmpty(L) == 1)
        printf("empty list.\n");
    printf("List length is %d.\n", ListLength(L));
    ListInsert(0, 10, L); // 往L索引0插入元素值为
    ListInsert(1, 11, L); // 往L索引1插入元素值为
    ListInsert(2, 12, L); // 往L索引2插入元素值为
    PrintList(L);

    puts("-------------------------------");
    ListItem delete_num = ListDelete(1, L); // 删除L位置1(索引0)的元素 10
    PrintList(L);
    ListFree(L);
    puts("free list success.");
    return 0;
}

void ItemShow(ListItem x) // 输出表元素
{
    
    
    printf("%d \n", x);
}

List ListInit(int size) // 表结构初始化,返回一个结构体指针
{
    
    
    List L = (List)malloc(sizeof *L);
    L->table = (ListItem *)malloc(size * sizeof(ListItem));
    L->maxsize = size;
    L->n = 0; // 表长
    return L;
}

int ListEmpty(List L) // 测试表是否为空
{
    
    
    return L->n == 0;
}

int ListLength(List L) // 表L的长度
{
    
    
    return L->n;
}

ListItem ListRetrieve(int k, List L) // 返回表L位置k的元素,表索引从 0 开始
{
    
    
    if (k < 1 || k > L->n)
        return 0;
    return L->table[k - 1];
}

int ListLocate(ListItem x, List L) // 元素x在表L的位置(比起索引多1)
{
    
    
    for (int i = 0; i < L->n; i++)
        if (L->table[i] == x)
            return ++i;
    return 0;
}

void ListInsert(int k, ListItem x, List L) // 在表L索引k的位置插入元素x, 将k位置后的元素往后挪给x腾出位置,表长+1
{
    
    
    if (k < 0 || k > L->n)
        return;
    for (int i = L->n - 1; i >= k; i--)
        L->table[i + 1] = L->table[i];
    L->table[k] = x;
    L->n++;
}

ListItem ListDelete(int k, List L) //从表L中删除位置k(索引为k-1)的元素,返回被删除的元素;将k位置后元素往前移填补被删除的位置,表长-1
{
    
    
    if (k < 1 || k > L->n)
        return 0;
    ListItem x = L->table[k - 1];
    for (int i = k; i < L->n; i++)
        L->table[i - 1] = L->table[i];
    L->n--;
    return x;
}

void PrintList(List L) // 按照位置次序输出表L中的元素
{
    
    
    for (int i = 0; i < L->n; i++)
        ItemShow(L->table[i]);
}

void ListFree(List L) // 使用结束后释放动态分配的数组空间
{
    
    
    free(L->table);
    free(L);
}

result:

empty list.
List length is 0.
10
11
12
-------------------------------
11
12
free list success.

猜你喜欢

转载自blog.csdn.net/qq_44880154/article/details/113515862