C语言 | 数据结构之顺序表

文章目录

    • C语言 | 数据结构之顺序表
      • 顺序表初始化
        • 顺序表另外一种初始化方式:
      • 检查顺序表是否为空
      • 检查顺序表是否已满
      • 遍历顺序表
      • 在顺序表中插入元素
      • 在顺序表中删除元素
      • 代码工程实例
        • 工程文件
        • 工程编译Makefile
        • 测试Demo
        • 编译、运行

C语言 | 数据结构之顺序表

顺序表,全名顺序存储结构,是线性表的一种。线性表用于存储逻辑关系为“一对一”的数据,因此顺序表也是。

顺序表对数据的物理存储结构也有要求。顺序表存储数据时,会提前申请一整块足够大小的物理空间,然后将数据依次存储起来,存储时做到数据元素之间不留一丝缝隙。

#define SIZE    (8)
typedef int datatype;
typedef struct seqlist{
    datatype data[SIZE];
    int last;
}seq_list, *seq_plist;

如下图,就是上述顺序表的数据存储的示意图:

C语言 | 数据结构之顺序表_第1张图片

顺序表的另一种定义方式:

typedef struct Table{
    int * head;//声明了一个名为head的长度不确定的数组,也叫“动态数组”
    int length;//记录当前顺序表的长度
    int size;//记录顺序表分配的存储容量
}table, * p_table;

  • 顺序表初始化

void seqlist_init(seq_plist *L)
{
    *L = (seq_plist)malloc(sizeof(seq_list));
    if(L == NULL){
        perror("malloc err");return;
    }

    (*L)->last = -1;
}
顺序表另外一种初始化方式:
seq_plist seqlist_init0(void)
{
    seq_plist l = NULL;
    l = (seq_plist)malloc(sizeof(seq_list));
    if(l == NULL){
        perror("malloc err");return NULL;
    }

    l->last = -1;
    return l;
}
  • 检查顺序表是否为空

C语言 | 数据结构之顺序表_第2张图片

bool seqlist_isempty(seq_plist l)
{
    if(l->last == -1){
        return true;
    }else{
        return false;
    }
}
  • 检查顺序表是否已满

C语言 | 数据结构之顺序表_第3张图片

bool seqlist_isfull(seq_plist l)
{
    if(l->last == (SIZE - 1)){
        return true;
    }else{
        return false;
    }
}
  • 遍历顺序表

void seqlist_show(seq_plist l)
{
    int i;
    for(i = 0; i<= l->last; i++){
        printf("%d\t", l->data[i]);
    }
    printf("\n");
}
  • 在顺序表中插入元素

C语言 | 数据结构之顺序表_第4张图片

bool seqlist_insert(seq_plist l, datatype data)
{
    int i,j;
    if(seqlist_isfull(l)){
        printf("seqlist is full !\n");return false;
    }

    for(i = 0; i<= l->last; i++){
        if(data < l->data[i]){
            break;
        }
    }

    for(j = l->last; j >= i; j--){
        l->data[j+1] = l->data[j];
    }

    l->data[i] = data;

    l->last++;
    return true;

}
  • 在顺序表中删除元素

C语言 | 数据结构之顺序表_第5张图片

bool seqlist_del(seq_plist l, datatype data)
{
    int i,j;
    if(seqlist_isempty(l)){
        printf("seqlist is empty!\n");return false;
    }

    for(i = 0; i<= l->last; i++){
        if(data == l->data[i]){
            break;
        }
    }

    if(i > l->last){
        printf("data %d is not exit.\n", data);return false;
    }

    for(j = i; j< l->last; j++){
        l->data[j] = l->data[j+1];
    }

    l->last --;
    return true;
}

  • 代码工程实例

工程文件
[fly@fly-vm seqlist]$ tree
.
├── main.c
├── Makefile
├── seqlist.c
└── seqlist.h

0 directories, 4 files
工程编译Makefile
CC             	 = gcc
CFLAGS  		= -Wall -g -O0
OBJS    		= seqlist
SRC              = main.c seqlist.c

all:$(OBJS)

$(OBJS):$(SRC)
        $(CC) $(CFLAGS) -o $@ $^

clean:
        $(RM) $(OBJS) .*.sw?

.PHONY: all clean
测试Demo
/*
   1、用顺序表存储一些正整数,输入正整数
   表示插入数据(比如输入3表示插入3),
   输入负整数表示删除数据(比如输入-2
   表示删除2),输入字符表示退出程序。
   插入和删除的过程中保持该表递增有序。
 */
void tester_seqlist(void){
    seq_plist l;
    datatype data;
    int ret;

    printf("sizeof(seq_list) = %ld\n", \
        sizeof(seq_list));

    seqlist_init(&l);
    while(1){
        printf("Please input data: ");
        ret = scanf("%d", &data);
        if(ret != 1){
            exit(0);
        }else if(data > 0){
            seqlist_insert(l, data);
            seqlist_show(l);
        }else{
            seqlist_del(l, -data);
            seqlist_show(l);
        }
    }
}
编译、运行
[fly@fly-vm seqlist]$ make
gcc -Wall -g -O0 -o seqlist main.c seqlist.c
[fly@fly-vm seqlist]$ ./seqlist
sizeof(seq_list) = 36
Please input data: 1001
1001
Please input data: 1002
1001    1002
Please input data: 1003
1001    1002    1003
Please input data: 1004
1001    1002    1003    1004
Please input data: 1005
1001    1002    1003    1004    1005
Please input data: 1006
1001    1002    1003    1004    1005    1006
Please input data: 1007
1001    1002    1003    1004    1005    1006    1007
Please input data: 1008
1001    1002    1003    1004    1005    1006    1007    1008
Please input data: 1009
seqlist is full !
1001    1002    1003    1004    1005    1006    1007    1008
Please input data: -1003
1001    1002    1004    1005    1006    1007    1008
Please input data: -1008
1001    1002    1004    1005    1006    1007
Please input data: -1001
1002    1004    1005    1006    1007
Please input data: -1002
1004    1005    1006    1007
Please input data: -1005
1004    1006    1007
Please input data: -1006
1004    1007
Please input data: -1004
1007
Please input data: -1007

Please input data: -1000
seqlist is empty!

Please input data: q

6    1007
Please input data: -1002
1004    1005    1006    1007
Please input data: -1005
1004    1006    1007
Please input data: -1006
1004    1007
Please input data: -1004
1007
Please input data: -1007

Please input data: -1000
seqlist is empty!

Please input data: q

你可能感兴趣的:(2.数据结构与算法,数据结构,c语言,链表)