线性表定义:它是含有n>=0个结点的有限序列,有且仅有一个开始结点,它没有前驱但有一个后继结点,有且仅有一个终端结点,它没有后继但有一个前驱结点,其它的结点都有且仅有一个前驱和后继.
线性表的存储结构:顺序存储和链式存储
什么是顺序表?线性表采用顺序存储的方式存储就称为顺序表.
顺序表头文件
//或通过一个配置文件配置
#define MAXSIZE 100
//抽象整形数据或其它数据类型
typedef int datatype;
typedef struct{
datatype a[MAXSIZE];
int size;
}sequence_list;
//初始化
void init(sequence_list *p)
{
//尽管数组a中可能有值但我们不去用它当它作废
p->size = 0;
}
//顺序表后面插入
void insert(sequence_list *p,datatype value)
{
if((p->size) >= MAXSIZE)
printf("已满!/n");
else
p->a[p->size++] = value;
}
//打印各结点
void print_list(sequence_list *p)
{
int i = 0;
if(p->size==0)
printf("表是空的!/n");
else
for(;i<p->size;i++)
printf("%d-------%d/n",i,p->a[i]);
}
//判断是否为空,返回0表示非空
int is_empty(sequence_list *p)
{
return p->size?0:1;
}
//查找结点值为x的结点,平均时间复杂度为线性表长度的一般,假设长为n则平均时间复杂度为n/2
int find_num(sequence_list *p,datatype value)
{
int i=0;
for(; i<p->size; i++)
if(p->a[i] == value)
break;
if(i < p->size)
return i;
else
return -1;
}
//书上更为紧凑的一段程序
int find_num2(sequence_list *p,datatype value)
{
int i = 0;
while((i<p->size) && (p->a[i] != value))
i++;
return (i<p->size)?i:-1;
}
//顺序取得第i个结点的值,超界就返回-1但是没有下面的代码幽雅
int get_data_pos(sequence_list *p,int num)
{
if(num < 0)
printf("Parameter error/n!");
else
return (num<p->size)?p->a[num]:-1;
}
int get_data_pos2(sequence_list *p,int num)
{
if(num<0 || num>= p->size)
printf("位置不存在!/n");
else
return p->a[num];
}
以上代码3.4.4编译通过.
//顺序表任意位置结点插入
void insert_pos_sequence_list(sequence_list *p,int pos,datatype value)
{
int i;
if((p->size)==MAXSIZE)
printf("The sequence_list is full/n");
if(pos<0 || pos>p->size)
printf("the position doesn't exsit!/n");
else
for(i=p->size;i>pos;i--)
p->a[i]=p->a[i-1];
p->a[pos]=value;
p->size++;
}
//顺序表某结点值删除
void delete_val_sequence_list(sequence_list *p,datatype value)
{
int i;
i=0;
while(i<p->size && p->a[i]!=value)
i++;
if(i<p->size)
for(;i<p->size-1;i++)
p->a[i]=p->a[i+1];
else
{printf("not found the value: %d/n",value);exit(1);}
p->size--;
}
//顺序表删除第position位置的结点
void delete_pos_sequence_list(sequence_list *p,int position)
{
int i;
if(p->size==0)
{printf("空表!/n"); exit(1);}
if(position<0 || position>=p->size)
{printf("指定位置不存在!/n");exit(1);}
for(i=position;i<p->size-1;i++)
p->a[i]=p->a[i+1];
p->size--;
}