2.已知乙個帶表頭結點的單鏈表,結點結構為data、link,假設該鍊錶只給出了頭指標list。時間複雜度q(n)在不改變鍊錶的前提下,請設計乙個盡可能高效的演算法,查詢鍊錶中倒數第k個位置上的結點(k正為整數)。
若查詢成功,演算法輸出該結點的data域的值,並返回1;否則,只返回0.要求:
(1)描述演算法的基本設計思想;
(2)描述演算法的詳細實現步驟;
(3)根據設計思想和實現步驟,採用程式語言描述演算法,關鍵之處請給出簡要注釋。
結果#include
#include
#include
//建立乙個整型的鍊錶
typedef struct _numnode numnode;
struct _numnode;
//定義乙個指標的佇列
//資料區域
typedef struct _node node;
struct _node;
//控制區域
typedef struct _queue queue;
struct _queue;
//佇列實現
//建立乙個佇列
queue
* creatqueue()
//判斷是否為空
bool isempty(queue
*queue)
//入隊
void addqueue(queue
*queue,numnode * numnode)
//出隊
numnode * deleteq(queue
*queue)
else
}//整形鍊錶實現
//建立
numnode * creatnumnode()
//新增元素
void addnumnode(numnode * numnode, int num)
numnode * newnode=(numnode *)malloc(sizeof(numnode));
newnode->num=num;
newnode->next=
null;
node->next=newnode;
}//顯示所有元素
void showallnum(numnode *numnode)
}//查詢元素
int findbylastindex(numnode * numnode,int lastindex)
else
numnode1=numnode1->next;
}if(flag==
0) else
}int main()
showallnum(numnode);
printf("%d",findbylastindex(numnode,7));
}
宣告乙個鍊錶定義鍊錶
為鍊錶新增內容
獲取長度
按長度查詢
做插入操作
獲取長度實現:
用while(p->next!=null)方式獲取長度
按索引查詢指定位置實現:
while(index!=1);
對索引長度進行封裝:
關鍵步驟:findnodebyindex(node,nodelength(node)-index+1);正向變逆向查詢
#include
#include
#include
//定義鍊錶
typedef
struct _node * node;
struct _node;
//建立乙個鍊錶
node creatnode()
//新增乙個節點
bool addnode(node node,int num)
//獲取鍊錶長度
int nodelength(node node)
return length;
}//正向索引查詢
int findnodebyindex(node node, int index)
else
}printf("found it :%d\n",p->data);
return1;}
//逆向查詢
資料結構 鍊錶基礎練習題
1 反轉鍊錶 定義乙個函式,輸入乙個鍊錶的頭節點,反轉該鍊錶並輸出反轉後鍊錶的頭節點。definition for singly linked list.function listnode val param head return var reverselist function head ret...
鍊錶練習題1
給出兩個 非空 的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式儲存的,並且它們的每個節點只能儲存 一位 數字。如果,我們將這兩個數相加起來,則會返回乙個新的鍊錶來表示它們的和。您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。示例 輸入 2 4 3 5 6 4 輸出 ...
資料結構練習題
設pa,pb分別指向兩個帶頭結點的有序 從小到大 單鏈表。仔細閱讀如下的程式,並回答問題 1 程式的功能 2 s1,s2中值的含義 3 pa,pb中值的含義。include include typedef struct list list void exam list pa,list pb else...