线性数据类型

线性表定义:它是含有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--;

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值