1、已知乙個帶表頭結點的單鏈表,結點的結構為(data,link)。假設該鍊錶只給出了表頭指標list,在不改變鍊錶的前提下請設計乙個盡可能有效的演算法,查詢鍊錶中倒數第k個位置上的結點(k為正數)。若查詢成功,演算法輸出該結點的data域的值,並返回1,否則只返回0. 要求:
(1)描述該演算法的基本設計思想;
(2)描述該演算法的詳細實現步驟;
(3)根據演算法的基本設計思想和詳細實現步驟,採用程式語言描述演算法,關鍵之處請給出簡要注釋。
演算法一:
----- 1)思想:遍歷一趟鍊錶,找到倒數第k個結點的位置。
定義兩個遍歷指標p和q。初始時均指向表頭結點的下乙個結點(即鍊錶的第乙個結點)。首先讓指標p移動到鍊錶第k個結點,然後指標q與指標p同步移動;當指標p移動到鍊錶最後乙個結點時,指標q所指示的結點就是倒數第 k 個結點的位置。
----- 2)演算法的詳細實現步驟
- a、定義指標p和q,p = q = list->link; 定義計數器 count = 1;
- b、當p->link == null時轉移到d,否則重複下列c步。
- c、如果 count < k 時執行 count = count +1;否則 q = q->link;
- d、如果count < k 表明 k 值太大超過了表的長度,函式返回0。否則輸出q指標所指結點的data值並返回1.
- e、演算法結束
----- 3)用c語言描述演算法如下:
#include using namespace std;
#define ok 1
#define error 0
#define true 1
#define false 0
typedef int status;
typedef int elemtype;
typedef struct node
node,*linklist;
//typedef struct node *linklist;
//typedef node *linklist;
//l:指向頭指標的指標(無頭結點)
status search_k(linklist list,int k) //list是頭指標
if(countdata);
return ok;
}}
演算法二:分兩步走:
第一趟遍歷計算表的長度n,如果n-k+1<1 則返回0;
第二趟遍歷停止於第n-k+1個結點位置,它就是倒數第k個結點,輸出值並返回1.
#include using namespace std;
#define ok 1
#define error 0
typedef int status;
typedef int elemtype;
typedef struct node
node,*linklist;
//typedef struct node *linklist;
//typedef node *linklist;
//l:指向頭指標的指標(無頭結點)
status search_k(linklist list,int k) //list是頭指標
if(n-k<0) return error;
while(countlink;
count++;
} printf("%d",q->data);
return ok;
}
演算法三:使用乙個與鍊錶長度同樣大小的輔助陣列
此演算法對單鏈表做一趟遍歷,依次讀出各結點的data值並順序存入該輔助陣列,同時計算鍊錶長度n,如果 n-k+1<1則返回0,
否則直接輸出輔助陣列中第n-k+1個元素的值並返回1.
#include using namespace std;
#define ok 1
#define error 0
#define maxsize 100 //預估乙個輔助陣列容量
typedef int status;
typedef int elemtype;
typedef struct node
node,*linklist;
//typedef struct node *linklist;
//typedef node *linklist;
//l:指向頭指標的指標(無頭結點)
status search_k(linklist list,int k) //list是頭指標
if(n-k<0) return error;
printf("%d",a[n-k]); //不用加1,陣列下標從0開始
return ok;
}
演算法四:使用乙個與鍊錶長度同樣大小的棧
此演算法對單鏈表做一趟遍歷,依次讀出各結點的data值並存入初始為空的棧中;然後逐個元素出棧,直到退出第k個棧元素為止。如果還未退到第k個元素棧就空了,則返回0,否則輸出退出的第k個棧元素的值並返回1.
#include using namespace std;
#define ok 1
#define error 0
#define maxsize 100 //預估乙個棧的容量
typedef int status;
typedef int elemtype;
typedef int selemtype;
typedef struct node
node,*linklist;
typedef struct
sqstack;
//進棧操作push,插入元素e為新的棧頂元素
status push(sqstack *s,selemtype e)
//出棧操作pop,若棧不為空,則刪除s的棧頂元素,用e返回其值
status pop(sqstack *s,selemtype *e)
status search_k(linklist list,sqstack *s,int k)
while(i演算法五:使用乙個可儲存 k 個元素的一維陣列
此演算法對單鏈表做一趟遍歷,依次讀出各結點的data值並存入初值為空的一維陣列中。如果鍊錶所有資料都存入陣列而陣列不滿(鍊錶的資料元素不滿k個),則返回0;否則將鍊錶資料迴圈存入陣列中,當鍊表所有資料都處理完,則最後存入陣列元素的下乙個元素即為鍊錶的倒數第k個元素,輸出它的值並返回1.
#include using namespace std;
#define ok 1
#define error 0
typedef int status;
typedef int elemtype;
typedef struct node
node,*linklist;
//typedef struct node *linklist;
//typedef node *linklist;
//l:指向頭指標的指標(無頭結點)
status search_k(linklist list,int k) //list是頭指標
if(p==null&&idata;
p = p->link;
i++;
} printf("%d",b[i%k]);
return ok;
}
線性表演算法題庫 線性表習題
鍊錶。若指標p指向某結點時,能夠根據該指標找到其直接後繼,能夠順後繼指標鏈找到p結點後的結點。但是由於不知道其頭指標,所以無法訪問到p指標指向的結點的直接前趨。因此無法刪去該結點。2.雙鏈表。由於這樣的鍊錶提供雙向指標,根據p結點的前趨指標和後繼指標可以查詢到其直接前趨和直接後繼,從而可以刪除該結點...
複習 線性表習題
1.順序儲存方式插入和刪除時效率太低,因此它不如鏈式儲存方式好。x 二者各有優缺點 取元素和插入刪除 應看具體場景 2.鍊錶中的頭結點僅起到標識的作用。x 頭結點還有簡化操作的作用 3.靜態鍊錶中指標表示的是 下一元素的陣列下標 4.設乙個鍊錶最常用的操作是在末尾插入結點和刪除尾結點,則選用 d 最...
線性表練習題
題目 1 有序鍊錶的合併 將2個遞增的有序鍊錶合併為 乙個鍊錶的有序鍊錶 要求結果鍊錶仍然使 用兩個鍊錶的儲存空間,不不另外佔 用其他的儲存空間.表中不不允許有重複的資料。演算法思想 1 假設待合併的鍊錶為la和lb,合併後的新錶使用頭指標lc lc的表頭結點設為la的表頭結點 指向.pa 和 pb...