數據結構中,順序表的插入操作,為什麼方法要用指針,直接操作struct不可以嗎?求解

int insertElement(List *list, int i, elementType e) {

if (list-&>leight &> MaxSize)

{

return ERROR;

}

else if ((i &< 0) || i &> (list-&>leight + 1))

{

return ERROR;

}

else

{

for (int j = list-&>leight - 1; j &>= i; i--)

{

list-&>data[j + 1] = list-&>data[j];

}

list-&>data[i] = e;

list-&>leight++;

return OK;

}

}

int insertElement(List *list, int i, elementType e)

這個list為什麼要用指針,直接操作不可以嗎?


您的意思是直接傳入一個List然後返回一個List嗎?那這個效率也太低了。


因為傳參的時候要傳入順序表結構體的指針,即指針調用,調用函數時才能對順序表進行修改。

如果形參是結構體本身,那就是傳值調用,操作一通後對實參並沒有修改。

具體可以了解一下傳值調用和指針調用,很久沒用c了,如果回答錯了多多包涵

PS:隨手寫了這段代碼,可以體會一下

#include&

typedef struct Stu{
int age;
char name[20];
}Stu;

void fun1(Stu stu){
stu.age = 13;
stu.name[1] = x;
return;
}

void fun2(Stu *stu){
stu-&>age = 13;
stu-&>name[1] = x;
return;
}

int main(void){
Stu stu1 = {12, "abcd"};
fun1(stu1);
printf("%d, %s
", stu1.age, stu1.name);
fun2(stu1);
printf("%d, %s
", stu1.age, stu1.name);

return 0;
}

運行結果:

12, abcd

13, axcd


如果是直接操作的話,在調用function的時候會copy一個副本然後對這個副本操作一波,然後調用完畢後這個copy的臨時對象就會被銷毀了,使用指針的話就是找到這個對象,然後再進行操作

可以理解為,當沒有使用指針時,主函數找不到你到底要修改哪一個,會自己生成一個臨時對象然後進行操作,但是當函數執行完畢後,這個生成的對象就會被銷毀釋放了,對實際的對象並沒有實際改動,翻譯成人話就是:指針版:把那個二傻子找出來打一頓再扔回去。無指針版:找不到這個二傻子,大街上隨便抓一個打一頓走了。


我理解你是想把Function從

1. insertElement(List* list )

變成 2. insertElement(List list)

如果不用指針的話,是改不了原本的list 的數據的

Function(1.) 是把你想加入list的地址傳過去, 改數據就直接基於地址位置改但是 Function(2.) 是基於原本list的數據 copy一份並傳過去,所以現在會有兩個list, 最終你所插入的新element 是插入到複製(新生成)的那個list 里,而不是你原本(久)的list.

隨便一本c語言書上,都介紹了形式參數和實際參數。

裡面肯定有幾個好例子,其中涉及到了指針,建議你看看。

你的疑惑,也就來自於你對這一塊知識點沒搞懂。

直接用struct相當於傳值給形式參數,根本沒有動搖你要操作的那個對象。


用指針就是

insert(*list)

不用指針就是

list a = insert(list)之後用a就可以了,注意釋放指針

效率較低罷了


你有1到100的整齊排列盒子,在50和51之間插入一個盒子,你得挪多少盒子?有了指針,呵呵,我只要手指一下就行,相當於就挪個編號。你說我為什麼要用指針呢,效率啊。


不傳指針也可以,傳引用,這樣語法和語意上都滿足需求了。


推薦閱讀:
相关文章