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,單鏈表就到這里了,其實對於這種簡單的插入和刪除操作,我們可以試着加入更多操作,像菜單界面啊,文件保存和打開啊,大家加油!!!
有不對的希望大家幫忙指出來哦!!