静态顺序表是把大小已经分配好,顺序表是利用数组,实现增删查改。
首先我们要声明一个结构体,定义一个数组,它的总大小 ,还有一个用来计数它实际的大小。
我们来看代码。
先看头文件的声明:
#pragma once
#include<assert.h>
#define sequence_table_max_length 100
#define TYPECHAR char
#define SHOWTYPE "%c"
typedef struct seqlist
{
size_t size ;
TYPECHAR seq_t [sequence_table_max_length];
}seqlist;
seqlist seq ;
void show(seqlist *seq); //打印顺序表
void initlist(seqlist *seq); //初始化
void end_push_list(seqlist *seq,TYPECHAR value); //尾部插入一个元素
void end_pop_list(seqlist *seq); //尾部删除一个元素
void frist_push_list(seqlist *seq,TYPECHAR value); //头部插入一个元素
void frist_pop_list(seqlist *seq); //头部删除一个元素
void read_element_of_anywhere_address(seqlist *seq,size_t address); //读任意位置的元素
void update_element_of_anywhere_address(seqlist *seq,size_t address,TYPECHAR value); //修改任意位置元素的位置
void gei_yuansuh_shibie_xiabiao(seqlist *seq,TYPECHAR value); //查找所给元素的下标
void insert_element_of_anywhere_address(seqlist *seq,size_t address,TYPECHAR value); //在任意位置插入一个元素
来看具体的代码:
#include<stdio.h>
#include"sequence.h"
void show(seqlist *seq) //打印列表
{
size_t i = 0;
for(i=0; i <(seq->size); i++)
{
printf("%c",seq->seq_t[i]);
}
printf("\n");
}
void initlist(seqlist *seq) //初始化列表
{
seq->size = 0;
assert(seq);
seq->seq_t[seq->size] = 0;
}
void end_push_list(seqlist *seq,TYPECHAR value) //尾部插入一个元素
{
assert(seq);
if(seq->size > sequence_table_max_length)
{
fprintf(stderr,"顺序表长度不足\n");
return ;
}
seq->seq_t[seq->size] = value;
seq->size++;
}
void end_pop_list(seqlist *seq) //尾部删除一个元素
{
assert(seq);
if(seq->size <= 0)
{
fprintf(stderr,"已经到达最首部\n");
return;
}
seq->size--;
}
void frist_push_list(seqlist *seq,TYPECHAR value) //首部插入一个元素
{
size_t i = 0;
assert(seq);
seq->size++;
if(seq->size > sequence_table_max_length)
{
fprintf(stderr,"顺序表长度不足\n");
}
for(i=seq->size; i>0; i--)
{
seq->seq_t[i] = seq->seq_t[i-1];
}
seq->seq_t[i] = value;//下标为0
}
void frist_pop_list(seqlist *seq) //在顺序表首部删除一个元素
{
size_t i = 0;
assert(seq);
seq->size--;
for(i=0; i < seq->size; i++)
{
seq->seq_t[i] = seq->seq_t[i+1];
}
}
//读取任意位置的元素。address为位置。
void read_element_of_anywhere_address(seqlist *seq,size_t address)
{
assert(seq);
if(address > seq->size)
{
fprintf(stderr,"访问越界\n");
}
printf(SHOWTYPE,seq->seq_t[address]);
}
//修改指定位置的元素。address为修改的下标。value为修改成的值。
void update_element_of_anywhere_address(seqlist *seq,size_t address,TYPECHAR value)
{
assert(seq);
if(address > seq->size)
{
fprintf(stderr,"修改越界\n");
}
seq->seq_t[address] = value;
}
void gei_yuansu_chazhao_xiabiao(seqlist *seq,TYPECHAR value) // 给元素查找下标subscript value 为所给元素
{
size_t i = 0;
assert(seq);
for(i=0; i<seq->size; i++)
{
if(seq->seq_t[i] == value)
{
printf("查找元素下标为:%d\n",i);
break;
}
}
if(i==seq->size)
{
printf("未查找到\n");
}
}
//在任意位置插入一个元素。address插入的位置。value要插入的值。
void insert_element_of_anywhere_address(seqlist *seq,size_t address,TYPECHAR value)
{
size_t i = 0;
assert(seq);
seq->size++;
if(seq->size > sequence_table_max_length)
{
fprintf(stderr,"顺序表长度不足\n");
}
for(i = seq->size; i>address; i--)
{
seq->seq_t[i] = seq->seq_t[i-1];
}
seq->seq_t[i] = value;
}
int main()
{
initlist(&seq);
//end_push_list(&seq,'a');
//end_push_list(&seq,'b');
//end_push_list(&seq,'c');
//end_pop_list(&seq);
//frist_push_list(&seq,'d');
//frist_push_list(&seq,'e');
//frist_pop_list(&seq);
//read_element_of_anywhere_address(&seq,0);
//update_element_of_anywhere_address(&seq,2,'q');
//gei_yuansuh_shibie_xiabiao(&seq,'b');
//insert_element_of_anywhere_address(&seq,0,'w');
show(&seq);
return 0;
}
以上就是静态顺序表的实现。。。