線性表的插入和刪除


hello,大家好,又見面了,這次我們來講講線性表

線性表其實跟數組差不多,但多了一個指針的傳遞

我們先來看看線性表的定義:

 typedef struct {

     int *elem;                          

     int length;          //這里我們定義了線性表的長度,也就是元素的個數了//

     int listsize;           //這個就是我們線性表的存儲容量了//

 }Sqlist;

這樣就定義完了,是不是很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,單鏈表就到這里了,其實對於這種簡單的插入和刪除操作,我們可以試着加入更多操作,像菜單界面啊,文件保存和打開啊,大家加油!!!

有不對的希望大家幫忙指出來哦!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM