http://www.yuanma.org/data/2006/0718/article_1163.htm
// 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\n",result,TestArray2[result]);
head = CreateLinkTable(DEFAULT_ARRAY_SIZE,TestArray2);
ListLinkTable(head,"原始");
/*
p = lk_Order_Search(head,KEY);
if(p==NULL)
printf("\n尋找結果是:指定鏈表中沒有[資料域 = %d]的節點!\n",KEY);
else
printf("\n尋找結果是:節點.Data = %d\t節點.Link = %d\t節點.Addr = %d\n",p->data,p->link,p);
*/
printf("輸入插入節點的個數:\t");
scanf("%d",&count);
for(i=0;i<count;i++)
{
printf("輸入插入節點的資料域:\t");
scanf("%d",&KEY);
lk_Dynamic_Insert(head,KEY);
}
do
{
printf("輸入刪除節點的資料域:\t");
scanf("%d",&KEY);
lk_Dynamic_Delete(head,KEY);
}while(head!=NULL);
printf("\n\n應用程式正在運行......\n");
return 0;
}