基于递归的折半查找
(图片来源网络,侵删)
【注意】真的mid下标是begin+我想的mid!!!
#include #define MAXSIZE 100 using namespace std; void HalfSearch(int a[],int e,int begin,int end){ if(endroot; if(root=='#'){ T=NULL; return; } T=new BiNode; T->data=root; CreateTree(T->lchild); CreateTree(T->rchild); } bool Check(BiTree T){ if(T->lchild){ if(T->datalchild->data)return false; } if(T->rchild){ if(T->data>T->rchild->data)return false; } return true; } int main(){ while(true){ BiTree T; CreateTree(T); if(!T)break; if(Check(T))coutdata)return false; } if(T->rchild){ if(T->data>T->rchild->data)return false; } return true; } void MidTraverse(BiTree T,int x,int &tag){ if(T){ BiTree p=T; if(p->datarchild,x,tag); } else if(p->data>=x){ MidTraverse(p->lchild,x,tag); if(tag==1)coutn; if(n==0)break; BiTree T=NULL; int data; for(int i=0;i>data; CreateTree(T,data); } int x; cin>>x; int tag=0; MidTraverse(T,x,tag); coutdata;p->next=NULL; while(t->next)t=t->next; t->next=p; t=p; } } void GetLastK(LinkList L,int k){ LinkList slow=L->next; LinkList fast=L->next; int cnt=0; //往后移动k步 while(cntnext; } while(fast){ slow=slow->next; fast=fast->next; } coutnext=NULL; CreateList(L,n); int k;cin>>k; GetLastK(L,k); cin>>n; } return 0; }
数组的循环左移(真·循环+左移....)
#include using namespace std; void MoveLeft(int *a,int len,int p){ while(p!=0){ p--; int tmp=a[0]; for(int i=0;i>p; MoveLeft(a,n,p); ShowArray(a,n); cin>>n; } return 0; }
数组的主元素查询
#include using namespace std; int FindMain(int *a,int n){ //一共要进行n-1次 for(int i=0;irchild){ //遇到了叶子结点 nowValue+=T->data*pathlen; return; } if(T->lchild){ pathlen++; WPL(T->lchild,nowValue,pathlen); pathlen--; } if(T->rchild){ pathlen++; WPL(T->rchild,nowValue,pathlen); pathlen--; } } int main(){ while(1){ BiTree T; CreateTree(T); if(!T)break; int wpl=0; int len=0; WPL(T,wpl,len); coutnext; cnt++; } q->next=NULL; p->next=myL->next; }
找出数组中和为目标值的两个数
#include using namespace std; #define MAXSIZE 100 void GetTwo(int a[],int n,int &p,int &q,int target){ for(int i=0;in; while(n!=0){ int a[n]; for(int i=0;i>a[i]; int target; cin>>target; int p,q; GetTwo(a,n,p,q,target); coutnext; t->next=p; t=p; } } bool IsEmpty(LinkList L){ if(L->next==NULL) return true; else return false; } void PrintList(LinkList L){ LinkList p=L->next; while(p){ coutnext)coutnext; preSlow=preSlow->next; fast=fast->next; } preSlow->next=slow->next; if(IsEmpty(L))coutk; DeleteList(L,k); cin>>n; } return 0; }
基于链表的两数之和
【总结】本题涉及了一个关于进位的事就是写成if 9XXX,不要害怕
#include using namespace std; typedef struct LNode{ int data; struct LNode *next; }LNode,*LinkList; //头插法创建链表 void CreateList(LinkList &L,int n){ L=new LNode; L->next=NULL; LinkList t=L; for(int i=0;i>p->data;p->next=NULL; p->next=t->next; t->next=p; } } bool IsEmpty(LinkList L){ if(L->next==NULL) return true; else return false; } void PrintList(LinkList L){ LinkList p=L->next; while(p){ coutnext)coutdata+p2->data+c; if(sum>=10){ sum-=10; c=1; } else c=0; LinkList node=new LNode; node->data=sum; node->next=NULL; p3->next=node; p3=node; p1=p1->next; p2=p2->next; } if( p1 && p1->data==9 && c==1){ LinkList node1=new LNode; node1->data=0; LinkList node2=new LNode; node2->data=1; node1->next=node2; node2->next=NULL; p3->next=node1; } else if( p2 &&p2->data==9 && c==1){ LinkList node1=new LNode; node1->data=0; LinkList node2=new LNode; node2->data=1; node1->next=node2; node2->next=NULL; p3->next=node1; } else if(c==1){ LinkList node=new LNode; node->data=1; node->next=NULL; p3->next=node; } } int main(){ int m,n; cin>>m>>n; while(n!=0 && m!=0){ LinkList L1; CreateList(L1,m); LinkList L2; CreateList(L2,n); LinkList myL; myL->next=NULL; Sum(L1,L2,myL); PrintList(myL); cin>>m>>n; } return 0; }
交换链表中的两个结点
【注】有时候的交换其实就是值的交换,不用捣腾指针,而且注意更改指针后,后移不要盲目的想成p=p->next
#include using namespace std; typedef struct Lnode { int data; struct Lnode *next; } Lnode, *Linklist; void Init_Linklist(Linklist &l) { l = new Lnode; l->next = NULL; } void CreatLinklist(Linklist &l, int n) { Linklist p = l; Linklist r; for (int i = 1; i > r->data; r->next = p->next; p->next = r; p = r; } } void Exchange(Linklist &l) { Linklist p = l->next; while (p) { if(p->next != NULL){ swap(p->data, p->next->data); p = p->next->next; }else{ break; } } } void Out(Linklist &l) { Linklist p = l->next; while (p->next) { cout data next; } cout data > n; if (n == 0) break; Linklist l; Init_Linklist(l); CreatLinklist(l,n); Exchange(l); Out(l); } return 0; }
链表的循环右移(这个没有要头结点。先成环,再去掉链接)
#include using namespace std; typedef struct LNode{ int data; struct LNode *next; }LNode,*LinkList; //创建链表 void CreateList(LinkList &L,int n){ L=new LNode; L->next=NULL; cin>>L->data; LinkList t=L; for(int i=0;i>p->data;p->next=NULL; t->next=p; t=p; } } void Move(LinkList &L,int k){ LinkList cur=L; int cnt=1; while(cur->next){ cur=cur->next; cnt++; } cur->next=L; int m=cnt-k%cnt; for(int i=0;inext; LinkList newp=cur->next; cur->next=NULL; L=newp; } void PrintList(LinkList L){ LinkList p=L; while(p){ coutnext)cout>k; Move(L,k); PrintList(L); cin>>n; } return 0; }
查找数组中缺失的数字
#include using namespace std; void FindNum(int a[],int n){ int ans[n]; for(int i=0;i
文章版权声明:除非注明,否则均为VPS857原创文章,转载或复制请以超链接形式并注明出处。
还没有评论,来说两句吧...