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.