线性表的插入和删除

hello,你们好,又见面了,此次咱们来说讲线性表数组

线性表其实跟数组差很少,但多了一个指针的传递函数

咱们先来看看线性表的定义:spa

 typedef struct {指针

     int *elem;                          it

     int length;          //这里咱们定义了线性表的长度,也就是元素的个数了//for循环

     int listsize;           //这个就是咱们线性表的存储容量了//变量

 }Sqlist;List

这样就定义完了,是否是很OK,接下来咱们看看怎么建立线性表循环

1.建立函数链表

int Initlist_Sq(Sqlist *L){

      L->elem=(int *)malloc(LIST_INIT_SIZE*sizeof(int));    //分配存储空间,malloc函数用来分配,elem用来保存咱们分配的空间的地址//

      if(!L->elem) exit(ERROR);                                           //还没懂ing//

     L->length=0;                                                                 //初始线性表的长度设为0//

     L->listsize=LIST_INIT_SIZE;                                        //这个list什么size是咱们一开始就define(宏定义)的一个值哦//

     return OK;

  }

一个分配空间函数,几个赋值,一个简单的线性表就被创造出来啦

2.插入函数

进入咱们的第一个功能函数,插入

你们想想数组的内容,a[0],a[1].......数组就是经过这样来保存值的,那咱们要插入一个怎么办

没错,就是用中间变量,用中间变量来保存插入那个位置的量如何经过一个for或者while循环咱们就能够把值传递下去了

这样咱们就在线性表的中间插入了一个值

int ListInsert_Sq(Sqlist *L,int i,int e){

     if(i<1||i>L->length+1) return ERROR;                       //若是咱们输入插入的位置大于线性表的长度怎么办,一个if帮你解决//

     int *newbase,*q,*p;

     if(L->length>=L->listsize){                                        //这个if就是用来判断咱们如今拥有的空间是否是足够再插入进一个元素,不够的话咱们就须要再分配一下了//

         newbase=(int *)realloc(L->elem,(L->listsize+LISTINCREMENT)*sizeof(int));

          if(!newbase) exit(ERROR);

          L->elem=newbase;                                              //咱们把新开辟的空间地址传递一下//

          L->listsize+=LISTINCREMENT;                           //这个就是用来增长咱们拥有的空间的了//

      }

     q=&(L->elem[i-1]);                                                      //咱们上面提到的中间变量哦//

     for(p=&(L->elem[L->length-1]);p>=q;--p)    *(p+1)=*p;    //for循环把后面的值

     *q=e;

     ++L->length;                                                                 //这里我只能说,没用,由于要用到指针传递,否则这个长度好像就没用传递回去,我依旧又用了外部变量,你们有更好解决方案或者对指针熟悉的能够在评论区里告诉我哦

     return OK;

 }

3.删除函数

删除删除删除,你们想一下,线性表怎么删除呢?

仍是拿数组来做对比,想删除一个中间的东西,其实就是把后面的元素覆盖到前面来,占据那个你想删除的位置

int ListDelete_Sq(Sqlist *L,int i){

     if(i<1||(i>L->length)) return ERROR;                //已是第4个了吧,判断输入的位置//

     int *p,*q,e;

     p=&(L->elem[i-1]);                                           //把删除的位置告诉p,注意是i-1哦,由于线性表是从0开始的哦//

  e=*p;                                                                //留做记念的e//

     q=L->elem+L->length-1;                                  //怎么忽然冒出来一个q呢,你们想想,咱们要把后面的元素所有往前移,那怎么判断到底了呢,这里就设置了一个                                                                                         q,做为结束的标志//

     for(++p;p<=q;++p)    *(p-1)=*p;                        //这个就是用来覆盖的啦//

     return OK;

  }

4.主函数

好了,总于到了主函数了,不容易,坚持一下,立刻就完了

void main()

{

        Sqlist L;                                                       //定义一个线性表//

        int i,len,e,a,b;

        Initlist_Sq(&L);             //建立线性表//

        printf("请输入线性表的长度:   ");

        scanf("%d",&len);

        L.length=len;

        printf("请输入线性表的元素:   ");

        for(i=0;i<len;i++){

            scanf("%d",L.elem+i);

            L.listsize--;                                                //每输入一个元素,存储空间也就会相对的减小//

        }

        printf("\n请选择 1,插入  2,不插入  :");

        scanf("%d",&a);

        if(a==1){

            printf("请输入要插入的元素:  ");

            scanf("%d",&e);

            printf("请输入要插入的位置:  ");

            scanf("%d",&i);

    ListInsert_Sq(&L,i,e);

      printf("插入后的线性表为\n");

    for(i=0;i<len+1;i++){                               //你们还记得我在上面说到过的长度返回不了吧,由于只插入一次,因此咱们就直接+1了,有点投机取巧,哎//

            printf("%d   ",L.elem[i]);                         //看这个输出元素,是否是真的跟数组差很少呀,是否是//

            }

        }

  else

    a=0;                                                    //为何冒出来一个a=0呢,后面就知道啦//

        printf("\n请选择 1,删除  2,不删除  :");

        scanf("%d",&b);

        if(b==1)

   {

            printf("请输入要删除元素的位置:  ");

            scanf("%d",&i);

    ListDelete_Sq(&L,i);

    printf("删除后的线性表为\n");

    for(i=0;i<len+a-1;i++){                           //一样是长度不能返回,为何这里不同呢,由于删除首先就要-1,可是咱们还要判断以前是否是进行了插入操做,因此                                                                                就用到a啦//

            printf("%d   ",L.elem[i]);

            }

  }

 

}

ok,单链表就到这里了,其实对于这种简单的插入和删除操做,咱们能够试着加入更多操做,像菜单界面啊,文件保存和打开啊,你们加油!!!

有不对的但愿你们帮忙指出来哦!!

相关文章
相关标签/搜索