演算法2.8:單鏈表中插入乙個節點
下面是書中的偽**:
status listinsert_l(linklist &l, int i, elemtype e)
if (!p || j > i-1) return error; // i小於1或者大於表長
s = (linklist)malloc(sizeof(lnode)); // 生成新結點
s->data = e; s->next = p->next; // 插入l中
p->next = s;
return ok;
} // linstinsert_l
下面我們來分析下:
1.第一行是status表示一種狀態,因為c語言裡面沒有泛型,所以用這個表示。演算法2.9:帶頭結點的鍊錶的刪除2.這裡的linklist是*linklist(書上對這個有定義,在本部落格中不再說明)。
3.這裡如果linklist &l,是乙個鍊錶,這個p指向了l的位址。這樣的話當while迴圈結束後,那麼p就是指向第i-1個元素的位址。
4.s在堆中開闢了乙個lnode大小的空間,並且把e賦值給了s->data。
5.插入時我們要注意,先把p->next給s->next(就是先連s後繼,如果先連線p的後繼話這個鍊錶是不能連起來的,大家可以試試),然後在連線p的後繼。
下面是書中的偽**:
status listdelete_l(linklist &l, int i, elemtype &e)
if (!(p->next) || j > i-1) return error; // 刪除位置不合理
q = p->next;
p->next = q->next; // 刪除並釋放結點
e = q->data;
free(q);
return ok;
} // listdelete_l
下面是思路:
這個程式比較簡單,我們講解下思路就可以了。先用p指向要刪除的linklist的前面那個元素,用q指向p後面那個元素(也就是要刪除的元素),把q->next賦值各p->next,這樣的化就把q隔離出來了,最後在free就可以了。這個比較簡單。演算法2.10:建立帶頭結點的單鏈表。
下面是書中的偽**:
void createlist_l(linklist &l, int n)
} // createlist_l
下面是思路:
1.帶頭結點的鍊錶是指,鍊錶裡面的第乙個結點,不存資料。演算法2.11:2.這裡的i是要包含除頭結點外的還有多少個節點。
3.這裡的random函式是產生隨機種子,他在標頭檔案#include中,大小為0~199。
4這裡是在表頭中不停的插入,而不是在表尾中插入。
如何將兩個有序鍊錶並為乙個有序鍊錶。
下面是偽**:
void mergelist_l(linklist &la, linklist &lb, linklist &lc)
else
} pc->next = pa ? pa : pb; // 插入剩餘段
free(lb); // 釋放lb的頭結點
} // mergelist_l
下面我們來分析下:
1.這個程式是思路是,用三個linklist,pa,pb.pc分別指向la,lb的第乙個元素lc的頭結點,然後比較,pa->data,和pb->data的值,誰下就把誰放入pc,然後指標後移,在最後,把還剩下的那個鏈的部分,直接接到pc。演算法2.12:2.這偽**有個問題,也就是最後的free(lb),如果要清理,也要加上free(la)才行。
3.這個例子的巧妙之處在於只需將原來兩個鍊錶中節點之間的關係解除,程式按元素非遞減的關係將所有節點鏈結成乙個鍊錶即可。
在靜態鏈線性表l中查詢第1個值為e的元素
下面是偽**:
int locateelem_sl(slinklist s, elemtype e) // locateelem_sl
下面我們來分析下:
1.靜態鍊錶:在不設定「指標」型別的高階程式語言中使用的,需要預先分配乙個較大的空間。2.這個程式的思路是:cur是乙個指示器類似於next,如下圖所示,相信看了下圖,就能理解,下圖是插入資料元素shi和刪除資料元素zheng
3.這個cur存的是下標(因為這是slinklist[maxsize])。演算法2.13:4.最後返回陣列下標的值。
在靜態鏈中將所有未被使用過以及被刪除的分量用游標鏈成乙個備用的鍊錶,每當進行插入時便可從備用鍊錶上取得第乙個結點作為待插入點;反之,在刪除時將此元素插入s表
下面以(a-b)u(b-a)=(aub)-(a∩b)為例子。
假設由終端輸入集合元素,先建立表示集合a的靜態鍊錶s,從而在輸入集合b的元素的同時查詢s表,若存在和b相同的元素,則從s表刪除,否則插入s表。
演算法2.13功能:將整個陣列空間初始化成乙個鍊錶。
演算法2.14功能:從備用空間取得乙個結點。
演算法2.15功能:將空間節點鏈結到備用鍊錶上。
演算法2.16功能:完整功能實現
下面是偽**:
下面我們來分析下**:void initspace_sl(slinklist space) // malloc_sl
1.malloc的全稱為mallocate,意思是分配。演算法2.15:將空間節點鏈結到備用鍊錶上2.這個程式是首先得到下標為0的鍊錶對應的cur,當下標為0的cur不為0時,說明非空,則把space[0].cur這個是數提出來,再把這個陣列對應的下標賦值給0對應的下標。
3.不懂的同學,帶幾個數進去就懂了。
下面是偽**:
下面我們來分析下:void free_sl(slinklist &space, int k) // free_sl
這個是先把以前0的下標給後陣列第k行對應的下標,然後到陣列0下標改為k。演算法2.16:完整功能實現下面是偽**:
下面我們來分析一下:void difference(slinklist &space, int &s)
printf(")\n");
space[r].cur = 0; // 尾結點的指標為空
initrandom_c1();
printf(" b = ( ");
for (j=1; j<=n; ++j)
if (k == space[r].cur) else
} printf(")\n");
} // difference
1.這裡面用產生了兩個隨機種子賦值給了m和n。假設a=(c,b,e,g,f,d),b=(a,b,n,f)則,這圖很好的表示了此演算法:2.這裡的random_next_c1();函式估計就是引數乙個隨機字元。
3.第乙個for迴圈結束後把space裡面下標為1-m的數都賦值了。
4.第二個for迴圈裡面的while迴圈,是判斷是否有相同的數,和是不是檢索完了陣列。
2 3 線性表的鏈式表示
一.單鏈表的定義 1.線性表的鏈式儲存又稱為單鏈表,它是指通過一組任意的儲存單元來儲存線性表中的資料元素。為了建立資料元素之間的線性關係對每個鍊錶結點,除存放元素自身的資訊外,還需要存放乙個指向 其後繼的指標。2.單鏈表中結點型別的描述如下 typedef struct lnode 定義單鏈表結點型...
線性表的鏈式表示和實現(鏈式)
課程名 資料結構 實驗目的 1 掌握線性表的定義 2 掌握線性表的基本操作,如建立 查詢 插入和刪除等。實驗要求 定義乙個包含學生資訊 學號,姓名,成績 的順序表和煉表,使其具有如下功能 1 根據指定學生個數,逐個輸入學生資訊 2 逐個顯示學生表中所有學生的相關資訊 3 根據姓名進行查詢,返回此學生...
2 3線性表的鏈式表示和實現(靜態鍊錶)
樣例輸入 4 2 3 5 7 9 3 2 樣例輸出 find success 5 7 9 2 實現的功能是 將兩個鍊錶同時存在的元素刪除 鍊錶2存在而鍊錶1不存在的元素插入到鍊錶1中 查詢給定位置的元素 自己想的樣例 目的是為了更具體掌握該知識點 include define maxsize 100...