線性表習題一

2021-07-15 14:47:33 字數 3817 閱讀 4693

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...