查詢演算法集:順序查詢、二分查詢、插值查詢、動態查詢(陣列實現、連結串列實現)
// search.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "LinkTable.h"
#define MAX_KEY 500
//------------------------------陣列實現部分----------------------------------
/*
無序陣列順序查詢演算法函式nsq_Order_Search<用陣列實現>
引數描述:
int array[] :被查詢陣列
int n :被查詢陣列元素個數
int key :被查詢的關鍵值
返回值:
如果沒有找到: nsq_Order_Search = -1
否則: nsq_Order_Search = key陣列下標
*/
int nsq_Order_Search(int array[],int n,int key)
{
int i;
array[n] = key;
/*for迴圈後面的分號必不可少*/
for(i=0;key!=array[i];i++);
return(i<n?i:-1);
}
/*
有序陣列順序查詢演算法函式sq_Order_Search<用陣列實現>
引數描述:
int array[] :被查詢陣列
int n :被查詢陣列元素個數
int key :被查詢的關鍵值
返回值:
如果沒有找到: sq_Order_Search = -1
否則: sq_Order_Search = key陣列下標
*/
int sq_Order_Search(int array[],int n,int key)
{
int i;
array[n] = MAX_KEY;
/*for迴圈後面的分號必不可少*/
for(i=0;key>array[i];i++);
if(i<n && array[i] == key)
return(i);
else
return(-1);
}
/*
有序陣列二分查詢演算法函式sq_Dichotomy_Search0<用陣列實現>
引數描述:
int array[] :被查詢陣列
int n :被查詢陣列元素個數
int key :被查詢的關鍵值
返回值:
如果沒有找到: sq_Dichotomy_Search0 = -1
否則: sq_Dichotomy_Search0 = key陣列下標
*/
int sq_Dichotomy_Search0(int array[],int n,int key)
{
int low,high,mid;
low = 0;
high = n - 1;
while(low<=high)
{
mid = (high+low)/2;
if(array[mid] == key)
return(mid);
/*key>array[mid] 表明要求查詢的值在[mid+1,high]*/
/*否則,在[low,mid-1]*/
if(key > array[mid])
low = mid + 1;
else
high = mid - 1;
}
return(-1);
}
/*
有序陣列插值查詢演算法函式sq_Dichotomy_Search1<用陣列實現>
(插值查詢演算法是二分查詢演算法的改進)
引數描述:
int array[] :被查詢陣列
int n :被查詢陣列元素個數
int key :被查詢的關鍵值
返回值:
如果沒有找到: sq_Dichotomy_Search1 = -1
否則: sq_Dichotomy_Search1 = key陣列下標
*/
int sq_Dichotomy_Search1(int array[],int n,int key)
{
int low,high, //二分陣列的上,下標
pos; //查詢碼的大致(估算)位置
low = 0;
high = n-1;
while(low <= high)
{
pos = (key-array[low])/(array[high]-array[low])*(high-low)+low;
/*找到關鍵值,中途退出*/
if(key == array[pos])
return(pos);
if(key > array[pos])
low = pos + 1;
else
high = pos - 1;
}
/*沒有找到,返回-1*/
return(-1);
}
//------------------------------陣列實現部分----------------------------------
//------------------------------連結串列實現部分----------------------------------
/*
無序連結串列順序查詢演算法函式nlk_Order_Serach<用連結串列實現>
[查詢思想:遍歷連結串列的所有節點]
引數描述:
Node *head :被查詢連結串列的首指標
int key :被查詢的關鍵值
返回值:
如果沒有找到: nlk_Order_Serach = NULL
否則: nlk_Order_Serach = 鍵值為key的節點的指標
*/
Node *nlk_Order_Serach(Node *head,int key)
{
for(;head!=NULL && head->data != key;head = head->link);
return(head);
}
/*
有序連結串列順序查詢演算法函式lk_Order_Serach<用連結串列實現>
[查詢思想:依次遍歷連結串列的節點,發現節點不在key的範圍時提前結束查詢]
引數描述:
Node *head :被查詢連結串列的首指標
int key :被查詢的關鍵值
返回值:
如果沒有找到: lk_Order_Serach = NULL
否則: lk_Order_Serach = 鍵值為key的節點的指標
*/
Node *lk_Order_Search(Node *head,int key)
{
for(;head!=NULL && head->data < key;head=head->link);
/*當遍歷指標為NULL或沒有找到鍵值為key的節點,返回NULL(表明沒有找到)*/
/*否則,返回head(表明已經找到)*/
return(head==NULL || head->data != key ? NULL : head);
}
/*
有序連結串列動態查詢演算法函式lk_Dynamic_Search<用連結串列實現>
[查詢思想:依次遍歷連結串列的節點,發現節點不在key的範圍時提前結束查詢]
引數描述:
Node *head: 被查詢連結串列的首指標
Node **p; 鍵值為key的節點的前驅指標(回傳引數)
Node **q: 鍵值為key的節點指標(回傳引數)
int key : 被查詢的關鍵值
注意:
當 *p == NULL 且 *q != NULL,連結串列的首節點鍵值為key
當 *p != NULL 且 *q != NULL,連結串列的中間(非首,尾)節點鍵值為key
當 *p != NULL 且 *q == NULL,連結串列的尾節點鍵值為key
當 *p == NULL 且 *q == NULL,連結串列是空連結串列
*/
void lk_Dynamic_Search(Node *head,Node **p,Node **q,int key)
{
Node *pre,*cur;
pre = NULL;
cur = head;
for(;cur != NULL && cur->data < key;pre = cur,cur = cur->link)
*p = pre;
*q = cur;
}
/*
有序連結串列動態插入演算法函式lk_Dynamic_Insert<用連結串列實現>
引數描述:
Node *head: 被插入連結串列的首指標
int key : 被插入的關鍵值
返回值:
lk_Dynamic_Search = 插入鍵值為key的節點後的連結串列首指標
*/
Node *lk_Dynamic_Insert(Node *head,int key)
{
Node
*x, //插入節點的前驅節點
*y, //插入節點的後續節點
*p; //插入的節點
p = (Node *)malloc(sizeof(Node));
p->data = key;
p->link = NULL;
lk_Dynamic_Search(head,&x,&y,key);
if(x==NULL)
{
p->link = x;
head = p;
}
else
{
p->link = x->link;
x->link = p;
}
ListLinkTable(head,"插入節點");
return(head);
}
/*
有序連結串列動態刪除演算法函式lk_Dynamic_Delete<用連結串列實現>
引數描述:
Node *head: 被刪除連結串列的首指標
int key : 被刪除的關鍵值
返回值:
lk_Dynamic_Delete = 刪除鍵值為key的節點後的連結串列首指標
*/
Node *lk_Dynamic_Delete(Node *head,int key)
{
Node *x, //刪除節點的前驅節點
*y; //刪除的節點
lk_Dynamic_Search(head,&x,&y,key);
if(x==NULL)
/*因為x=NLLL時,y指向首指標*/
head = y->link;
else
x->link = y->link;
free(y);
ListLinkTable(head,"刪除節點");
return(head);
}
//------------------------------連結串列實現部分----------------------------------
int main(int argc, char* argv[])
{
Node *head;
//Node *p,*x,*y;
int KEY;
int count,i;
//int result;
KEY = 11;
//PrintArrayValue(TestArray2,DEFAULT_ARRAY_SIZE,"原始");
//result = sq_Dichotomy_Search1(TestArray2,DEFAULT_ARRAY_SIZE,KEY);
//printf("查詢結果是:陣列[%d] = %d ",result,TestArray2[result]);
head = CreateLinkTable(DEFAULT_ARRAY_SIZE,TestArray2);
ListLinkTable(head,"原始");
/*
p = lk_Order_Search(head,KEY);
if(p==NULL)
printf(" 查詢結果是:指定連結串列中沒有[資料域 = %d]的節點! ",KEY);
else
printf(" 查詢結果是:節點.Data = %d 節點.Link = %d 節點.Addr = %d ",p->data,p->link,p);
*/
printf("輸入插入節點的個數: ");
scanf("%d",&count);
for(i=0;i<count;i++)
{
printf("輸入插入節點的資料域: ");
scanf("%d",&KEY);
lk_Dynamic_Insert(head,KEY);
}
do
{
printf("輸入刪除節點的資料域: ");
scanf("%d",&KEY);
lk_Dynamic_Delete(head,KEY);
}while(head!=NULL);
printf(" 應用程式正在執行...... ");
return 0;
}
//
#include "stdafx.h"
#include "LinkTable.h"
#define MAX_KEY 500
//------------------------------陣列實現部分----------------------------------
/*
無序陣列順序查詢演算法函式nsq_Order_Search<用陣列實現>
引數描述:
int array[] :被查詢陣列
int n :被查詢陣列元素個數
int key :被查詢的關鍵值
返回值:
如果沒有找到: nsq_Order_Search = -1
否則: nsq_Order_Search = key陣列下標
*/
int nsq_Order_Search(int array[],int n,int key)
{
int i;
array[n] = key;
/*for迴圈後面的分號必不可少*/
for(i=0;key!=array[i];i++);
return(i<n?i:-1);
}
/*
有序陣列順序查詢演算法函式sq_Order_Search<用陣列實現>
引數描述:
int array[] :被查詢陣列
int n :被查詢陣列元素個數
int key :被查詢的關鍵值
返回值:
如果沒有找到: sq_Order_Search = -1
否則: sq_Order_Search = key陣列下標
*/
int sq_Order_Search(int array[],int n,int key)
{
int i;
array[n] = MAX_KEY;
/*for迴圈後面的分號必不可少*/
for(i=0;key>array[i];i++);
if(i<n && array[i] == key)
return(i);
else
return(-1);
}
/*
有序陣列二分查詢演算法函式sq_Dichotomy_Search0<用陣列實現>
引數描述:
int array[] :被查詢陣列
int n :被查詢陣列元素個數
int key :被查詢的關鍵值
返回值:
如果沒有找到: sq_Dichotomy_Search0 = -1
否則: sq_Dichotomy_Search0 = key陣列下標
*/
int sq_Dichotomy_Search0(int array[],int n,int key)
{
int low,high,mid;
low = 0;
high = n - 1;
while(low<=high)
{
mid = (high+low)/2;
if(array[mid] == key)
return(mid);
/*key>array[mid] 表明要求查詢的值在[mid+1,high]*/
/*否則,在[low,mid-1]*/
if(key > array[mid])
low = mid + 1;
else
high = mid - 1;
}
return(-1);
}
/*
有序陣列插值查詢演算法函式sq_Dichotomy_Search1<用陣列實現>
(插值查詢演算法是二分查詢演算法的改進)
引數描述:
int array[] :被查詢陣列
int n :被查詢陣列元素個數
int key :被查詢的關鍵值
返回值:
如果沒有找到: sq_Dichotomy_Search1 = -1
否則: sq_Dichotomy_Search1 = key陣列下標
*/
int sq_Dichotomy_Search1(int array[],int n,int key)
{
int low,high, //二分陣列的上,下標
pos; //查詢碼的大致(估算)位置
low = 0;
high = n-1;
while(low <= high)
{
pos = (key-array[low])/(array[high]-array[low])*(high-low)+low;
/*找到關鍵值,中途退出*/
if(key == array[pos])
return(pos);
if(key > array[pos])
low = pos + 1;
else
high = pos - 1;
}
/*沒有找到,返回-1*/
return(-1);
}
//------------------------------陣列實現部分----------------------------------
//------------------------------連結串列實現部分----------------------------------
/*
無序連結串列順序查詢演算法函式nlk_Order_Serach<用連結串列實現>
[查詢思想:遍歷連結串列的所有節點]
引數描述:
Node *head :被查詢連結串列的首指標
int key :被查詢的關鍵值
返回值:
如果沒有找到: nlk_Order_Serach = NULL
否則: nlk_Order_Serach = 鍵值為key的節點的指標
*/
Node *nlk_Order_Serach(Node *head,int key)
{
for(;head!=NULL && head->data != key;head = head->link);
return(head);
}
/*
有序連結串列順序查詢演算法函式lk_Order_Serach<用連結串列實現>
[查詢思想:依次遍歷連結串列的節點,發現節點不在key的範圍時提前結束查詢]
引數描述:
Node *head :被查詢連結串列的首指標
int key :被查詢的關鍵值
返回值:
如果沒有找到: lk_Order_Serach = NULL
否則: lk_Order_Serach = 鍵值為key的節點的指標
*/
Node *lk_Order_Search(Node *head,int key)
{
for(;head!=NULL && head->data < key;head=head->link);
/*當遍歷指標為NULL或沒有找到鍵值為key的節點,返回NULL(表明沒有找到)*/
/*否則,返回head(表明已經找到)*/
return(head==NULL || head->data != key ? NULL : head);
}
/*
有序連結串列動態查詢演算法函式lk_Dynamic_Search<用連結串列實現>
[查詢思想:依次遍歷連結串列的節點,發現節點不在key的範圍時提前結束查詢]
引數描述:
Node *head: 被查詢連結串列的首指標
Node **p; 鍵值為key的節點的前驅指標(回傳引數)
Node **q: 鍵值為key的節點指標(回傳引數)
int key : 被查詢的關鍵值
注意:
當 *p == NULL 且 *q != NULL,連結串列的首節點鍵值為key
當 *p != NULL 且 *q != NULL,連結串列的中間(非首,尾)節點鍵值為key
當 *p != NULL 且 *q == NULL,連結串列的尾節點鍵值為key
當 *p == NULL 且 *q == NULL,連結串列是空連結串列
*/
void lk_Dynamic_Search(Node *head,Node **p,Node **q,int key)
{
Node *pre,*cur;
pre = NULL;
cur = head;
for(;cur != NULL && cur->data < key;pre = cur,cur = cur->link)
*p = pre;
*q = cur;
}
/*
有序連結串列動態插入演算法函式lk_Dynamic_Insert<用連結串列實現>
引數描述:
Node *head: 被插入連結串列的首指標
int key : 被插入的關鍵值
返回值:
lk_Dynamic_Search = 插入鍵值為key的節點後的連結串列首指標
*/
Node *lk_Dynamic_Insert(Node *head,int key)
{
Node
*x, //插入節點的前驅節點
*y, //插入節點的後續節點
*p; //插入的節點
p = (Node *)malloc(sizeof(Node));
p->data = key;
p->link = NULL;
lk_Dynamic_Search(head,&x,&y,key);
if(x==NULL)
{
p->link = x;
head = p;
}
else
{
p->link = x->link;
x->link = p;
}
ListLinkTable(head,"插入節點");
return(head);
}
/*
有序連結串列動態刪除演算法函式lk_Dynamic_Delete<用連結串列實現>
引數描述:
Node *head: 被刪除連結串列的首指標
int key : 被刪除的關鍵值
返回值:
lk_Dynamic_Delete = 刪除鍵值為key的節點後的連結串列首指標
*/
Node *lk_Dynamic_Delete(Node *head,int key)
{
Node *x, //刪除節點的前驅節點
*y; //刪除的節點
lk_Dynamic_Search(head,&x,&y,key);
if(x==NULL)
/*因為x=NLLL時,y指向首指標*/
head = y->link;
else
x->link = y->link;
free(y);
ListLinkTable(head,"刪除節點");
return(head);
}
//------------------------------連結串列實現部分----------------------------------
int main(int argc, char* argv[])
{
Node *head;
//Node *p,*x,*y;
int KEY;
int count,i;
//int result;
KEY = 11;
//PrintArrayValue(TestArray2,DEFAULT_ARRAY_SIZE,"原始");
//result = sq_Dichotomy_Search1(TestArray2,DEFAULT_ARRAY_SIZE,KEY);
//printf("查詢結果是:陣列[%d] = %d ",result,TestArray2[result]);
head = CreateLinkTable(DEFAULT_ARRAY_SIZE,TestArray2);
ListLinkTable(head,"原始");
/*
p = lk_Order_Search(head,KEY);
if(p==NULL)
printf(" 查詢結果是:指定連結串列中沒有[資料域 = %d]的節點! ",KEY);
else
printf(" 查詢結果是:節點.Data = %d 節點.Link = %d 節點.Addr = %d ",p->data,p->link,p);
*/
printf("輸入插入節點的個數: ");
scanf("%d",&count);
for(i=0;i<count;i++)
{
printf("輸入插入節點的資料域: ");
scanf("%d",&KEY);
lk_Dynamic_Insert(head,KEY);
}
do
{
printf("輸入刪除節點的資料域: ");
scanf("%d",&KEY);
lk_Dynamic_Delete(head,KEY);
}while(head!=NULL);
printf(" 應用程式正在執行...... ");
return 0;
}
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=935672
相關文章
- 順序查詢和二分查詢
- 查詢演算法__插值查詢演算法
- DS靜態查詢之順序查詢
- #查詢演算法#【1】簡單查詢:順序、折半查詢演算法
- 如何找東西?查詢演算法之順序查詢和二分查詢詳解演算法
- 查詢——二分查詢
- 查詢(2)--動態查詢
- 順序查詢
- 查詢演算法__二分查詢演算法
- Access查詢實現Mysql的 limit 查詢MySqlMIT
- 陣列的查詢(搜尋):線性查詢和二分法查詢陣列
- 【java】【插值查詢】Java
- 查詢演算法之二分查詢演算法
- 插值查詢演算法演算法
- SSH:hiberate實現資料的查詢(單查詢和全查詢)
- DNS查詢順序DNS
- 查詢(1)--靜態查詢
- Python查詢-二分查詢Python
- mysql-分組查詢-子查詢-連線查詢-組合查詢MySql
- PHP 實現二分查詢PHP
- MySQL 查詢處理 SQL查詢執行順序MySql
- 資料結構-單連結串列查詢按序號查詢資料結構
- Laravel Query Builder 複雜查詢案例:子查詢實現分割槽查詢 partition byLaravelUI
- 轉:C++實現的變種二分查詢法(折半查詢)--二叉查詢樹C++
- mysql查詢結果多列拼接查詢MySql
- 二分查詢實現----面試總結面試
- 【資料結構】折半查詢(二分查詢)資料結構
- java陣列回顧---線性查詢最大值最小值---二分查詢Java陣列
- 二分查詢【折半查詢】演算法 PHP 版演算法PHP
- 資料庫 - 連線查詢、巢狀查詢、集合查詢資料庫巢狀
- Js實現二分查詢,加油JS
- Golang實現二分查詢法Golang
- 二分查詢(函式實現)函式
- django 動態查詢實現過程Django
- Java實現二分查詢演算法Java演算法
- SQL查詢的:子查詢和多表查詢SQL
- 查詢之折半查詢
- C#演算法設計查詢篇之03-插值查詢C#演算法