在資料結構線性表一章,對線性表有這些操作方法(operation):
/*operation*/
initlist(*l);/*初始化操作,建立乙個空的線性表l*/
listempty(l);/*判斷線性表是否為空表,若線性表為空,返回值為true,否則返回false*/
clearlist(*l);/*將線性表清空*/
getelem(l,i,*e);/*性表l中的第i個位置元素值返回給e*/
locateelem(l,e);/***性表l中查詢與給定值e相等的元素,如果查詢成功,返回該元素在表中序號;否則,返回0表示失敗*/
listinsert(*l,i,e);/*在第i個位置插入元素e*/
listdelete(*l,i,*e);/*刪除i個位置元素,並用e返回其值*/
listlength(l);/*返回線性表l的元素個數*/
我們sufexfy大致可以將上述函式分為兩類,一類引數列表中沒有*,例如:listempty(l);
另一類在l或者e前面有個(*)號,究竟是為什麼呢?
我們可以從下面這些**得到啟發
#include
#include
void test1(int a,int b)
int main()
執行結果如下,可見test1中a,b作為形參互相交換值對main函式中的實參並沒有影響
2112
process returned 0 (0x0) execution time : 0.118 s
press any key to continue.
讓我們對上述**稍作改動來觀察結果
#include
#include
void test1(int *a,int *b)
int main()
6422000
642200821
process returned 0 (0x0) execution time : 0.033 s
press any key to continue.
很顯然,此次的test1()方法對main函式的實參總算有了影響,因為現在的test()方法是直接對位址為6422000與6422008儲存單元資料域的修改。
我們繼續回到對線性表操作上來,就會恍然大悟。例如:listins程式設計客棧ert(*l,i,e),倘若不加*,那麼l就永遠作為乙個區域性變數留在了函式:listinsert(l,i,e)中,沒法發生實際的改變。加了*才能保證l被帶出來。我們只需要在方法定義時給形參加上'*',在方法呼叫時給形參加上'&'就能獲得預期的效果
思考:另一種解決思路:是不是可以定義一種list insert()方法,使得返回值為已經修改好的鍊錶l呢?
list i l,int i,elememttype e)
不過這也有個弊病,當插入發生在表頭時,l就必須要指向新的節點,否則位址仍指向的是原來 的表頭結點。解決方法也有,就是在鍊錶第乙個節點a前再插乙個無意義的頭節點b,這樣每次想要在表頭插入元素時只需插在a,b之間即可。
線性表操作(C語言)
題目描述 順序表是我們資料結構中的基本儲存形式,現在給定乙個順序表,有如下操作 insert x y 在順序表中x位置插入y元素,遍歷輸出當前順序表的所有元素。delete x 刪除順序表中的x元素,如果有多個x元素,只刪除第乙個x,遍歷輸出當前順序的所有元素。locate x 輸出順序表中x元素的...
線性表操作集(c語言)
typedef int position typedef struct lnode list struct lnode 初始化 list makeempty 查詢 define error 1 position find list l,elementtype x 插入 bool insert lis...
C語言線性表
include include include 定義乙個linearlist結構體 typedef struct linearlist linearlist 初始化線性表 param 無 return linearlist linearlist initlinearlist return ptr 插...