顺序表

顺序表

 顺序表属于顺序存储结构,是最简单的顺序表,基本思想是用一段连续的储存单元依次存储线性表的数据元素,一般使用数组来定义,就能实现增,删,改,差等基本操作。
 使用结构体来实现顺序表,结构体中有一个data数组,用来连续存储数据。变量last用来指明当前顺序表中有几个数据,方便访问顺序表。

    typedef struct seqlist{

        int data[MAX_LIST];  //数据域,MAX_LIST = 10
        int last; //下标域
    }my_seqlist, *p_my_seqlist;

初始化顺序表

 当需要创建一个顺序表时,可以调用此函数,此函数给顺序表分配一个堆空间,并且将地址返回,接收此返回值用p_my_seqlist变量。

    p_my_seqlist init_list(){

        p_my_seqlist p_my_seqlist1 = calloc(1, sizeof(my_seqlist));
        if(NULL == p_my_seqlist1)
            return false;
        return p_my_seqlist1;
    }

插入数据

 当需要在顺序表中插入数据的时候,调用此函数。注意需要传入已经初始化好的顺序表,第二个形参为需要插入的数据。

    int insert_seqlist(p_my_seqlist p_my_seqlist1, int data){

        if(NULL == p_my_seqlist1){

            printf("LIST指针为空
");
            return false;
        }
        if(MAX_LIST <= p_my_seqlist1->last){

            printf("顺序表以满,无法建立顺序表
");
            printf("p_my_seqlist1->last:%d
",p_my_seqlist1->last);
            return false;
    }

        p_my_seqlist1->data[p_my_seqlist1->last++] = data;  //每插入一个数据last需要加1,表示顺序表中的数据多了一个
        return true;
    }

打印顺序表

 将顺序表中的数据打印出来。

    int print_seqlist(p_my_seqlist p_my_seqlist1){

         int i;

         if(NULL == p_my_seqlist1){

         printf("LIST指针为空
");
         return false;
         }
         printf("p_my_seqlist1->last:%d
",p_my_seqlist1->last);
         TRAVERSR(){                  //#define TRAVERSR() for(int i = 0; i < p_my_seqlist1->last; i++) 因为这个循环会反复用到,所以使用了宏定义

             printf("p_my_seqlist->data[%d]:%d
", i, p_my_seqlist1->data[i]);
         }
         printf("p_my_seqlist1->last:%d
",p_my_seqlist1->last);
        return true;
    }

查找顺序表

 查找顺序表中的数据fdata,并且返回这个数据的下标。

    int find_seqlist(p_my_seqlist p_my_seqlist1, int fdata){

        if(NULL == p_my_seqlist1){

            printf("LIST指针为空
");
            return false;
        }

        printf("在顺序表中查找数据:%d
", fdata);
        TRAVERSR(){

            if(p_my_seqlist1->data[i] == fdata){

                printf("在顺序表中查找到数据:%d
", p_my_seqlist1->data[i]);
                return i;
            }
        
        }
        printf("顺序表中没有这个数据:%d
", fdata);
        return 0;
    }

删除数据

 可以调用此函数用来删除一个数据,参数2是删除下标del_num的值,可以配合函数find_seqlist()使用。

    int del_seqlist(p_my_seqlist p_my_seqlist1, int del_num){

        if(NULL == p_my_seqlist1){

            printf("LIST指针为空
");
            return false;
        }
    
        p_my_seqlist1->data[del_num] = p_my_seqlist1->data[del_num+1];
   
        for(;del_num < p_my_seqlist1->last-1;del_num++){
      
            p_my_seqlist1->data[del_num+1] =  p_my_seqlist1->data[del_num+2];
        }
  

       p_my_seqlist1->last--;
       printf("del_seqlist:p_my_seqlist1->last:%d
",p_my_seqlist1->last);

       return true;
}

修改顺序表

 将data[num]的数据修改为mdata,配合find_seqlist()使用,可以修改一个指定的值。

    int mdata_seqlist(p_my_seqlist p_my_seqlist1, int num, int mdata){

        if(NULL == p_my_seqlist1){

            printf("LIST指针为空
");
            return false;
        }

         p_my_seqlist1->data[num] = mdata;
         printf("数据修改为了:p_my_seqlist1->data[num] = : %d
", p_my_seqlist1->data[num]);

         return true;

}

销毁顺序表

 将顺序表所占的内存释放

    int destroy_seqlist(my_seqlist** p_my_seqlist1) //将&p_my_seqlist1传入
    {

        *p_my_seqlist1 = NULL;
        free(*p_my_seqlist1);
        printf("顺序表已被销毁了
");

        return true;
    }

测试函数

    int test(){

        p_my_seqlist p_my_seqlist1;
        //初始化顺序表
        p_my_seqlist1 = init_list();
        int find_data;

        if(NULL == p_my_seqlist1)
           return false;

        //插入10个数据
        insert_seqlist(p_my_seqlist1, 0);
        insert_seqlist(p_my_seqlist1, 1);
        insert_seqlist(p_my_seqlist1, 2);
        insert_seqlist(p_my_seqlist1, 3);
        insert_seqlist(p_my_seqlist1, 4);
        insert_seqlist(p_my_seqlist1, 5);
        insert_seqlist(p_my_seqlist1, 6);
        insert_seqlist(p_my_seqlist1, 7);
        insert_seqlist(p_my_seqlist1, 8);
        insert_seqlist(p_my_seqlist1, 9);

   
        //打印数据
        print_seqlist(p_my_seqlist1);

        //查找数据,返回数据的下标
        int num = find_seqlist(p_my_seqlist1,9);

        //删除数据
        del_seqlist(p_my_seqlist1, num);
        print_seqlist(p_my_seqlist1);

        //修改数据
        num = find_seqlist(p_my_seqlist1,8);
        mdata_seqlist(p_my_seqlist1,num,100);
        print_seqlist(p_my_seqlist1);

        //销毁表格
        destroy_seqlist(&p_my_seqlist1);
        printf("%p
", p_my_seqlist1);
        insert_seqlist(p_my_seqlist1, 49);    
        print_seqlist(p_my_seqlist1);
        del_seqlist(p_my_seqlist1, 2);

        return 1;
    }
原文地址:https://www.cnblogs.com/ding-ding-light/p/14100403.html