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,單鏈表就到這裏了,其實對於這種簡單的插入和刪除操做,咱們能夠試着加入更多操做,像菜單界面啊,文件保存和打開啊,你們加油!!!
有不對的但願你們幫忙指出來哦!!