数据结构的线性关系
线性关系:里面的每一个元素都是平等的,每个节点至多有一个前驱和一个后继。头部没有前驱,尾部没有后继。其结构类似于一维数组的结构。
如下图所示:
顺序存储结构
删除操作:对某一元素进行删除,其后面的元素都要往前移动一个单位。浪费CPU资源
插入操作:对数组中某一单元进行插入,后面的元素都要往后移动一个单位。操作麻烦。
缺点:一次空间分配,大小恒定,如果空间不够,无解;如果没有用完分配的空间,造成空间浪费。
一个顺序存储结构的程序
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct seq_line{//定义一个结构体(数据包),用于存放数据和数据指针
int data[16];
int index; //指向最后一个数
};
struct seq_line * seq_line_create(void)//
{
struct seq_line *line = malloc(sizeof(*line));//开辟一个栈空间
memset(line,0,sizeof(*line));//把line指向的空间置零
line->index = -1;
return line;
}
int seq_line_init(struct seq_line *seq)//为开辟出的空间初始化赋值
{
int i;
for(i=0;i< 12;i++){
seq->index++;
seq->data[ seq->index ] = i;
}
return 0;
}
int seq_line_is_empty(struct seq_line *seq)//检查空间是否为空
{
return seq->index == -1 ? 1 : 0;
}
int seq_line_is_full(struct seq_line *seq)//检查内存是否存满
{
return seq->index == 15 ? 1:0;
}
int seq_line_insert(struct seq_line *seq,int pos,int data)
{//在内存中插入新的数据
int i;
if(pos > seq->index){
printf("pos > index, valid ops\n");
return -11;
}
if(seq_line_is_full(seq)){
printf("%s %d seq is full\n",__func__,__LINE__);
return -12;
}
for(i=seq->index; i>=pos;i--){
seq->data[i+1] = seq->data[i];
}
seq->data[pos] = data;
seq->index++;
}
int seq_line_delete(struct seq_line *seq,int pos)
{//删除指定位置的数据
int i;
if(pos <0 || pos > seq->index ){
printf("%s %d valid pos %d\n",__func__,__LINE__,pos);
return -14;
}
for(i=pos;i <= seq->index -1; i++){
seq->data[i] = seq->data[i+1];
}
seq->index--;
return 0;
}
int seq_line_cnt(struct seq_line *seq)
{//统计数据的个数
return seq->index+1;
}
int seq_line_travel(struct seq_line *seq)
{//扫描打印输出数据
int i;
for(i=0;i<= seq->index;i++){
printf("%3d ",seq->data[i]);
}
printf("\n");
return 0;
}
int seq_line_find(struct seq_line *seq ,int data)
{//查找数据
int i;
for(i=0;I <= seq->index;i++){
if(seq->data[]==data)
printf(“%d是第%d个数”,data,i);
}
}
struct seq_line *seq;//定义一个结构体指针
void main(void)
{
seq = seq_line_create();
seq_line_init(seq);
seq_line_travel(seq);
printf("insert pos5 val 100\n");
seq_line_insert(seq,5,100);
seq_line_travel(seq);
printf("delete pos5\n");
seq_line_delete(seq,5);
seq_line_travel(seq);
}