數據結構中,順序表的插入操作,為什麼方法要用指針,直接操作struct不可以嗎?
數據結構中,順序表的插入操作,為什麼方法要用指針,直接操作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之間插入一個盒子,你得挪多少盒子?有了指針,呵呵,我只要手指一下就行,相當於就挪個編號。你說我為什麼要用指針呢,效率啊。
不傳指針也可以,傳引用,這樣語法和語意上都滿足需求了。
推薦閱讀: