刪除 L 中全部值爲 item 的元素
void Delete_e(SqList &L,ElemType e)
{int i=0,j=L.length-1;//設置數組低、高端指針(下標)。
while(i<j)
{ while(i<j&&L.elem[i]!=e)i++; //若值不爲e,右移指針。
while(i<j&&L.elem[j]==e){ j--; // L.length--;
}//若右端元素爲item,指針左移
if(i<=j){L.elem[i++]=L.elem[j--]; //L.length--;
}
L.length=i-1;
}
}
將數組中全部正數排在全部負數的前面
void Arrange(int A[],int n)
//n個整數存於數組A中,本算法
{int i=0,j=n-1,x; //數組下標從0開始
while(i<j)
{while(i<j && A[i]>0) i++;
while(i<j && A[j]<0) j--;
if(i<j) {x=A[i]; A[i++]=A[j]; A[j--]=x; }
//交換A[i] 與A[j] }
}//算法Arrange結束.
雙冒泡
void DoubleBubbleSort(KeyType R[],int n)
{ int i,low=0,high=n-1;
KeyType temp;
bool exchange;
while(low<high)
{ exchange=false;
//從前日後進行一次冒泡排序,將最大的值放在最後一個位置
for(i=low;i<high;++i)
{
if(R[i]>R[i+1]) //若是前面的值比後面的值大,發生交換
{ temp=R[i]; R[i]=R[i+1]; R[i+1]=temp;
exchange=true;
}
}
//從後往前進行一次冒泡排序,將最小的值放在第一個位置
for(i=high-1;i>low;--i)
{ if(R[i]<R[i-1]) //若是後面的值比前面的值小,發生交換
{
temp=R[i]; R[i]=R[i-1]; R[i-1]=temp;
exchange=true;
}
}
if(!exchange) //本趟沒有發生交換,提早終止
return;
++low; //更新上下邊界
--high;
}
}
求鏈表的最大數
Status Maxelem_L(LinkList L,int &max)
{ if (L->next==NULL) return error
else
{ LNode *p=L->next;
max=p->data; p=p->next;
while(p)
{ if(p->data>max) max=p->data;
p=p->next;
}
}
return ok;
}
遞歸方法求鏈表的最大數
int GetMax(LinkList p)
{
if(!p->next)
return p->data;
else
{
int max=GetMax(p->next);
return p->data>=max ? p->data:max;
}
}
利用棧數值轉換算法
void conversion ( int N,int k) {
initstack ( S );
while ( N ) {
push (S,N%k);
N = N / k;
}
while ( ! Stackempty(s) ){
pop ( S,e );
if(e<=9)
cout<<e;
else
cout<<char(e+55);
}
}//conversion
}
遞歸方法實現進制轉換
void conversion(int n)
{
if(n==0) return ;
else
{
conversion(n/8);
cout<<n%8;
}
}
在有序表 ST 中折半查找
int Search_Bin(SSTable ST,KeyType key,int low,int high)
{
if(low<=high)
{ mid=(low+high)/2;
if (key=ST.elem[mid].key) // 找到待查元素
return mid;
else if LT(key,ST.elem[mid].key)
return Search_Bin( ST, key,low,mid-1);
else
return Search_Bin( ST, key,mid+1,high); }
else return 0; // 順序表中不存在待查元素
}
二叉排序樹查找
BSTree Searchlev(BSTree T,char key,int &lev) {
//在根指針T所指二叉排序樹中遞歸地查找某關鍵字等於key的數據元素
//若查找成功,則返回指向該數據元素結點的指針和層次,不然返回空指針
if(T)
{ lev++;
if( key==T->data.key) return T; //查找結束
else if (key<T->data.key)
return Searchlev(T->lchild,key,lev); //在左子樹中繼續查找
else return Searchlev(T->rchild,key,lev); //在右子樹中繼續查找
}
else return T;
}
二叉排序樹查找非遞歸
BSTree Searchlev(BSTree T,int key,int &lev){
BSTree p=T;
while(p){
++lev;
if (key==p->data.key) return p;
else if (key<p->data.key)
p=p->lchild; //在左子樹中繼續查找
else p=p->rchild; //在右子樹中繼續查找
}
return p;
}
統計輸入字符串中數字字符和字母字符的個數
void count()
{ int i,num[36]; char ch;
for (i=0;i<36;i++) num[i]=0;
while ((ch=getchar())!='#')
{ if('0'<=ch&&ch<='9')
{ i=int(ch)-48; num[i]++;}
else if('A'<=ch&&ch<='Z')
{i=ch-65+10; num[i]++;}
}
for(i=0;i<10;i++)
cout<<"數字"<<i<<"的個數"<<num[i]<<endl;
for(i=10;i<36;i++)
cout<<"字母"<<char(i+55)<<"的個數"<<num[i]<<endl;
}
統計串 S 中字符的種類和個數
void StrAnalyze(SString S)//統計串S中字符的種類和個數
{char c; mytype T[20]; //用結構數組T存儲統計結果
int i,j;
for (i=0;i<=20;i++) T[i].ch='\0';
for(i=1;i<=S.length;i++)
{ c=S[i];j=0;
while(T[j].ch&&T[j].ch!=c) j++; //查找當前字符c是否已記錄過
if(T[j].ch) T[j].num++;
else { T[j].ch=c;T[j].num++;}
}//for
for(j=0;T[j].ch;j++)
cout<<T[j].ch<<":"<<T[j].num<<endl;
}//StrAnalyze
應用二叉排序樹分類統計
void CreaTree(BTree &p,char c) //採用遞歸方式構造一棵二叉排序樹
{ if (p==NULL) //p爲NULL,則創建一個新結點
{
p=new tnode;
p->ch=c;
p->count=1;
p->lchild=p->rchild=NULL;
}
else if (c==p->ch)
p->count++;
else if (c<p->ch)
CreaTree(p->lchild,c);
else
CreaTree(p->rchild,c);
}
鏈表的調整-逆置帶頭結點的單鏈表
void inverse(LinkList &L) {
// 逆置帶頭結點的單鏈表 L
p=L->next; L->next=NULL;
while ( p) {
q=p->next; // q指向*p的後繼
p->next=L->next;
L->next=p; // *p插入在頭結點以後
p = q;
}
}
鏈表選擇排序
void LinkedListSelectSort(LinkedList head)
//本算法一趟找出一個關鍵字最小的結點,其數據和當前結點進行交換;
//若要交換指針,則須記下當前結點和最小結點的前驅指針
p=head->next;
while(p!=NULL)
{
q=p->next; r->data=p->data; //設r是指向關鍵字最小的結點的指針
while (q!=NULL)
{
if(q->data<r->data) r->data=q->data;
q=q->next;
}
if(r!=p) r->data<-->p->data;//這裏表示交換這兩個節點
p=p->next;
}