[数据结构]顺序表的C语言简单实现

来源:互联网 发布:ps3下载版淘宝 编辑:程序博客网 时间:2024/04/29 06:21

  线性表分为顺序表和链表。
  以下是顺序表的实现,为了简单,没用考虑健壮性(没有对i的合法性进行判断等。)

#include <stdio.h>#include <stdlib.h>#define SIZE 100#define INCREMENT 50typedef int BOOL;#define TRUE 1#define FALSE 0typedef char ElemType;typedef struct{    ElemType data[SIZE]; //元素数组    int length; //长度    int capacity;   //容量}SqList;void InitList(SqList* list); //初始化顺序表BOOL Insert(SqList* list, ElemType e, int i);   //插入BOOL Delete(SqList* list, ElemType e);   //删除BOOL IsEmpty(SqList* list);  //判断为空int main(){    SqList list;    InitList(&list);    printf("%d\n", IsEmpty(&list));    Insert(&list, 'a', 1);    printf("%d\n", IsEmpty(&list));    Delete(&list, 'b');    printf("%d\n", IsEmpty(&list));    Delete(&list, 'a');    printf("%d\n", IsEmpty(&list));    return 0;}void InitList(SqList* list){    list->length = 0;    list->capacity = SIZE;}BOOL Insert(SqList* list, ElemType e, int pos){   //pos的范围1<=pos<=n    int i;    ++list->length;    for (i = list->length; i > pos-1; --i){        list->data[list->length] = list->data[list->length-1];    }    list->data[pos-1] = e;    return TRUE;}BOOL Delete(SqList* list, ElemType e){    int i, j;    for (i = 0; i < list->length; ++i){        if (list->data[i] == e){    //找到该元素            for (j = i; j < list->length; ++j){                list->data[j] = list->data[j+1];                --list->length;                return TRUE;            }        }    }    return FALSE;}BOOL IsEmpty(SqList* list){    if (list->length == 0) {        return TRUE;    } else {        return FALSE;    }}

这里我建议你打开两个窗口来讲下面的解释和代码一一对应来看。
Line 1~2 导入头文件
Line 4~5 数组的大小,以及增长的长度(这里我并没有用到,因为为了考虑健壮性)
Line 12~16 顺序表的数据结构,一个是元素数组,存放元素的,一个是顺序表的大小,一个是容量(数组有容量的大小,比如我们这里就分配了100个,超过了就会溢出,这时的解决办法就是重新分配一块更大的数组,这也就是上面增长长度的作用)。
Line 18~21 真实的一些操作远不止这些,说过了,这是简单实现,太多的代码很容易击退自信心,然后有注释,可以看一下
Line 23~35 主要是在main函数里,对表的操作进行测试
Line 37~39 为顺序表进行初始化,刚开始数组大小为0,然后容量是100
Line 42~50 这里注意,因为C语言里(包括很多别的类C语言)数组是从0开始的,而我们为了通用性,不考虑这些实现,所以那个pos的大小为1<=pos<=n,当把元素插入其中的位置时,我们需要后移元素(你们可以画个数组,比如现在有个顺序表是1 3 4 5 6,你们要元素10插入到2的位置时,先要把3 4 5 6后移,变成1 3 3 4 5 6,然后把第二个3换成10,最终形成1 10 3 4 5 6)。
Line 44 先把顺序表长度增加1位
Line 45~47 元素后移
Line 48 把插入的元素写到当前的位置,为什么是pos-1,说过了,数组是从0开始的,我们要插入第2个位置就是数组里面下标为1的那个位置。
Line 52~64 要删除顺序表的一个元素。思路就是先走到那个元素,还是刚才那个表(1 10 3 4 5 6),比如要删除3,只要找到3的位置,然后把4 5 6向前移动,变成(1 10 4 5 6 6 ),还有个6在数组怎么办,我们逻辑删除它,就是把顺序表的长度减少一位就可以了。
Line 54 循环,找到要删除的元素
Line 55 如果相等,说明找到了
Line 56~59 把元素向前移动,并且--list->length;,把长度减少。并且返回真
Line 63 如果没找到要删除的元素,会执行这句代码,返回假
Line 66~72 判断顺序表的大小是否为0就知道是否为空。

原创粉丝点击