数据结构(一)线性表

/**
*@author StormMaybin
*@Date 2016-07-15
*/

每一个成功者都有一个开始。勇于开始,才能找到成功的路。

是时候总结一下数据结构的知识了,总共会分为五篇文章来进行总结

一、 概念

线性表(Linear_list)是最常用也是最简单的数据结构。简言之,一个线性表是n个数据元素的有限序列。线性表是有线性结构的表。什么是线性结构呢?线性结构是n个数据元素的有序集合。它有四个基本特征:
  1.集合中必存在唯一的一个”第一个元素”;
  2.集合中必存在唯一的一个”最后的元素”;
  3.除最后元素之外,其它数据元素均有唯一的”后继”;
  4.除第一元素之外,其它数据元素均有唯一的”前驱”。
  如(a1,a2,a3,…..,an),a1为第一个元素,an为最后一个元素,此集合极为一个线性结构的集合。
  相对应于线性结构,非线性结构的逻辑特征是一个结点元素可能对应多个直接前驱和多个后驱。
  常用的线性结构有:线性表,栈,队列,双队列,数组,链表,串。
  
那么什么是顺序表呢?
顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元,依次存储数据元素的线性结构。顺序表的存储特点是:只要确定了起始位置,表中任一元素的地址都通过下列公式得到:* location(ki)=location(k1)+(i-1)len*

这里写图片描述

二、功能及实现:
  1. 结构体的定义
  2. 初始化
  3. 尾部插入值为x的节点
  4. 打印各节点的值
  5. 判断节点是否为空
  6. 查找值为x的节点的位置
  7. 取得i节点的值
  8. 在i位置插入x值
  9. 删除i位置的节点
1、结构体定义:
# define MAXSIZE 100
typedef int datatype;

//结构体的定义 
typedef struct list
{
    //数据
    datatype a[MAXSIZE]; 
    //整个顺序表的元素数量,为末尾元素的下一位置
    int size;
}sequence_list;
2、初始化:
//初始化 
void init_sequence_list(sequence_list *slt)
{  
      slt->size=0;  
}  
3、尾部插值
void insert_sequence_list(sequence_list *slt,datatype x)  
{  
       if(slt->size == MAXSIZE)
       {  
            printf("The list is full!\n");  
            exit(1);  
       }  
       //元素数量增加1
       slt->size=slt->size+1;  
       //插入数据
       slt->a[slt->size]=x;  
    }  
4、打印节点的值:
void print_sequence_list(sequence_list slt)  
{  
       int i;  
       if(!slt)   
            printf("\nThe list is empty!\n");  
       else  
            for(i=0;i<slt.size;i++)    
                printf("%5d",slt.a[i]);  
}  
5、判断是否为空:
int is_empty_sequence_list(sequence_list slt)  
{  
     return(slt.size == 0 ? 0:1);  
}  
6、查找值为x的节点的位置:
int find_num_sequence_list(sequence_list slt,datatype x)  

{  
       int i=0;  
       while(slt.a[i]!=x && i<slt.size)   
            i++;  
       return(i<slt.size? i:-1);  
}  
7、取得i节点的值:
datatype get_data_pos(sequence_list slt,int i)  
{  
       if(i < 0 || i >= slt.size)  
       {
             printf("The position dese not exist!\n");
             exit(1);
        }  
       else  
             return slt.a[i];  
    }  
8、在i位置插入x值:
void insert_pos_sequence_list(sequence_list *slt,int position,datatype x)  
{  
       int i;  
       if(slt->size==MAXSIZE)
       {  
            printf("\nThe list is full!\n");  
            exit(1);  
        }  
        if(position < 0 || position > slt->size)
        {    
            printf("\nThe position does not exist!");  
            exit(1);  
        }  
       for(i=slt->size;i>position;i--)   
            slt->a[i]=slt->a[i-1];  
       slt->a[position]=x;  
       slt->size++;  
    }     
9、 删除i位置的节点:
void delete_pos_sequence_list(sequence_list *slt,int position)  
{  
       int i;  
       if(slt->size == 0)  
       {
           printf("The list is empty!\n");exit(1);
        }  
       if(position < 0 || position >= slt->size)  
       {
           printf("The position does not exist!\n");
           exit(1);
        }  
       for(i=position;i<slt->size-1;i++)   
            slt->a[i]=slt->a[i+1];  
       slt->size--;  
     }  
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值