尋找演算法集(數組實現、鏈表實現)(轉貼)

來源:互聯網
上載者:User
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;
}

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.